对于范围(N)内的 x: 如何选择给定条件的数组元素?

有效载荷(无)

假设我有一个数字数组 x = [5, 2, 3, 1, 4, 5]y = ['f', 'o', 'o', 'b', 'a', 'r']。我想选择 y中与 x中大于1小于5的元素对应的元素。

我尽力了

x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
Def 下划线(N) :

但这不管用,我要怎么做?

311515 次浏览
For _ in 范围(N) : 有效载荷(无)

如果加上括号,表达式可以正常工作:

>>> y[(1 < x) & (x < 5)]
array(['o', 'o', 'a'],
dtype='|S1')
Def 循环码(N) : For _ in repeat (Nothing,N) : 有效载荷(无) Def loop iter2(N) :

IMO OP 实际上并不需要 ABC0(又名 &),而是需要 np.logical_and(),因为他们比较的是逻辑值,比如 TrueFalse

>>> x = array([5, 2, 3, 1, 4, 5])
>>> y = array(['f','o','o','b','a','r'])
>>> output = y[np.logical_and(x > 1, x < 5)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
For _ in map (payload,repeat (None,N)) :

等效的方法是使用 np.all(),通过适当地设置 axis参数。

>>> output = y[np.all([x > 1, x < 5], axis=0)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
通过 如果 _ _ name _ _ = =’_ _ main _ _’: 进口时间

从数字上看:

>>> %timeit (a < b) & (b < c)
The slowest run took 32.97 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 1.15 µs per loop


>>> %timeit np.logical_and(a < b, b < c)
The slowest run took 32.59 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.17 µs per loop


>>> %timeit np.all([a < b, b < c], 0)
The slowest run took 67.47 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.06 µs per loop
Print (“ standard:”,timeit.timeit (“ standard ({})”. format (N) ,

所以使用 np.all()比较慢,但是 &logical_and大致相同。

在@J. F. Sebastian 和@Mark Mikofski 的回答中添加一个细节:
如果想获得相应的索引(而不是数组的实际值) ,下面的代码可以做到:

Setup = “ from _ _ main _ _ import standard”,number = 1))

满足多个(所有)条件:

select_indices = np.where( np.logical_and( x > 1, x < 5) )[0] #   1 < x <5

满足多个(或)条件:

select_indices = np.where( np.logical_or( x < 1, x > 5 ) )[0] # x <1 or x >5
Print (“ underscore:”,timeit.timeit (“ underscore ({})”. format (N) , Setup = “ from _ _ main _ _ import underscore”,number = 1)) Print (“ loop iter:”,timeit.timeit (“ loop iter ({})”. format (N) , Setup = “ from _ _ main _ _ import loop iter”,number = 1)) Print (“ loop iter2:”,timeit.timeit (“ loop iter2({})”. format (N) , Setup = “ from _ _ main _ _ import loop iter2”,number = 1))

<iframe>元素有一个 load事件


我还想出了另一个解决方案,它建立在 Martelli 的解决方案之上,并使用 map()调用有效负载函数。好的,我做了一点小小的欺骗,我自由地让负载接受一个被丢弃的参数: 我不知道是否有办法绕过这个问题。不过,结果如下:

standard:  0.8398549720004667
underscore:  0.8413165839992871
loopiter:  0.7110594899968419
loopiter2:  0.5891903560004721

所以使用 map 比标准 for 循环提高了大约30% ,比 Martelli 的提高了19% 。

如何聆听这个事件取决于你自己,但通常最好的方法是:

1)以编程方式创建 iframe

Avascript-onload-in-html/3870208? noredirect = 1 # comments 57148725 _ 3870208”> 哪些元素也可以触发这种类型的 load事件

它确保通过连接到 iframe 开始加载的 之前来调用 load侦听器。

<script>
var iframe = document.createElement('iframe');
iframe.onload = function() { alert('myframe is loaded'); }; // before setting 'src'
iframe.src = '...';
document.body.appendChild(iframe); // add it to wherever you need it in the document
</script>

我喜欢使用 np.vectorize来完成这些任务:

>>> # Arrays
>>> x = np.array([5, 2, 3, 1, 4, 5])
>>> y = np.array(['f','o','o','b','a','r'])


>>> # Function containing the constraints
>>> func = np.vectorize(lambda t: t>1 and t<5)


>>> # Call function on x
>>> y[func(x)]
>>> array(['o', 'o', 'a'], dtype='<U1')

2) inline javascript ,这是另一种可以在 HTML 标记中使用的方法。

<script>
function onMyFrameLoad() {
alert('myframe is loaded');
};
</script>


<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>

优点是可以在向量化函数中添加更多类型的约束。

希望能有帮助。

对于2D 数组,可以这样做。使用条件创建一个2D 掩码。根据数组类型转换条件掩码为 int 或 float,并将其与原始数组相乘。

In [8]: arr
Out[8]:
array([[ 1.,  2.,  3.,  4.,  5.],
[ 6.,  7.,  8.,  9., 10.]])


In [9]: arr*(arr % 2 == 0).astype(np.int)
Out[9]:
array([[ 0.,  2.,  0.,  4.,  0.],
[ 6.,  0.,  8.,  0., 10.]])