blu*_*xel 34 python arrays numpy
说,我有一个由10元素组成的numpy数组,例如:
a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
现在我想有效地设置所有a值高于10对0,所以我会得到:
[2, 0, 0, 7, 9, 0, 0, 0, 5, 3]
因为我目前使用for循环,这非常慢:
# Zero values below "threshold value".
def flat_values(sig, tv):
"""
:param sig: signal.
:param tv: threshold value.
:return:
"""
for i in np.arange(np.size(sig)):
if sig[i] < tv:
sig[i] = 0
return sig
Run Code Online (Sandbox Code Playgroud)
我怎样才能以最有效的方式实现这一目标,同时考虑到10^6元素的大数组?
unu*_*tbu 86
In [7]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [8]: a[a > 10] = 0
In [9]: a
Out[9]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
Run Code Online (Sandbox Code Playgroud)
Mar*_*ler 30
通常,列表推导比forpython中的循环更快(因为python知道它不需要关心常规for循环中可能发生的很多事情):
a = [0 if a_ > thresh for a_ in a]
Run Code Online (Sandbox Code Playgroud)
但是,正如@unutbu正确指出的那样,numpy允许列表索引,并且元素方式比较为您提供索引列表,因此:
super_threshold_indices = a > thresh
a[super_threshold_indices] = 0
Run Code Online (Sandbox Code Playgroud)
会更快.
通常,在数据向量上应用方法时,请查看numpy.ufuncs,这通常比使用任何本机机制映射的python函数执行得更好.
yel*_*w01 11
如果您不想更改原始数组
In [1]: import numpy as np
In [2]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [3]: b = np.where(a > 10, 0, a)
In [4]: a
Out[4]: array([ 2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [5]: b
Out[5]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59782 次 |
| 最近记录: |