我有一个2D numpy python数组(1500,3712)。我想找到数组的指标,其值介于-10和-40之间。到目前为止,我有:
for item in lon_array:
for value in item:
if value >= -40. and value <= -10:
find_index = np.where(lon_array == value)
index = np.asarray(find_index).T
因为它是一个非常大的阵列,有没有办法让它更快?
答案 0 :(得分:2)
假设您的lon_array是一个numpy数组,您可以使用以下方法:
find_index = np.where(np.logical_and(lon_array >= -40, lon_arr <= -10))
index = np.asarray(find_index).T
由于np.where只需要一个条件,你可以将两个条件组合在一起以获得np.logical_and之间的条件。
它也可以作为单行代码完成:
>>> lon_arr
array([[ 20, -40],
[ 30, -30],
[ 20, -14],
[ 30, -30]])
>>> np.asarray(np.where(np.logical_and(lon_arr>=-40,lon_arr<=-10))).T
array([[0, 1],
[1, 1],
[2, 1],
[3, 1]])
答案 1 :(得分:1)
如果Stub._setProperty(Call.CHARACTER_SET_ENCODING, "ISO-8859-9");
是列表列表(Python的内置基本数据类型),使用lon_array
将是了解元素索引的最佳方法:
enumerate(...)
答案 2 :(得分:0)
使用numpy.where
,您可以根据数据的值提取索引,并保持对构建c code
的优化numpy
执行的数据的迭代:
import numpy as np
x = np.random.random(10).reshape(2, 5)
print(x)
indices = np.where(x < 0.2) #<--- this selects the indices based on a filter
print(indices)
x[indices]
[[ 0.11129659 0.33608351 0.07542966 0.44118394 0.14848829]
[ 0.8475123 0.27994122 0.91797756 0.02662857 0.52820238]]
# These are the indices produced by np.where:
# the first array contains the rows `i` and the second the columns `j`
(array([0, 0, 0, 1]), array([0, 2, 4, 3]))
array([ 0.11129659, 0.07542966, 0.14848829, 0.02662857])
因为你的过滤器中有两个条件,我建议你使用以下构造,它允许构建一个比np.where
直接接受的更复杂的布尔表达式:
indices = np.where(np.logical_or(x < 0.2, x > 0.8))
答案 3 :(得分:0)
此解决方案与之前的答案非常相似。不同之处在于我使用operator模块中的和_()函数和NumPy的 where()和 transpose():
>>> import numpy as np
>>> import operator
>>> x = np.linspace(-110, 0, 12).reshape(4, 3)
>>> x
array([[-110., -100., -90.],
[ -80., -70., -60.],
[ -50., -40., -30.],
[ -20., -10., 0.]])
>>> np.transpose(np.where(operator.and_(x >= -40, x <= -20)))
array([[2, 1],
[2, 2],
[3, 0]], dtype=int64)