我有一个数组,想要使用另一个数组更改基于分类的元素。
也就是说,我导入一个数组,然后如果cell [i,j]的值在一定限度内(比如介于1和8之间),则将secondArray [i,j]乘以0.3并将结果放入在[i,j]
处输出数组我有一些代码可以做到这一点(并且可能解释了我的意思更清楚)但它需要'非常'很长时间(因为我的数组大约是1000 * 1000个元素)并且想知道是否有更有效的解决方案
目前我有:
..
import numpy as np
def Factor_AM(cell):
if cell < 1 return 0.2;
elif cell < 8: return 0.3;
else: return 0.5;
mat = np.array(..some code to get an array from an external source..) //size 1000*1000
mat_out_1 = np.zeros_like(mat)
mat_out_1 = np.zeros_like(mat)
mat_ClassifyMe = np.array(..some code to import another 1000*1000 array with values in)
for index, x in np.ndenumerate(mat):
mat_out_1[index] = Factor_AM(x) * mat_ClassifyMe[index]
mat_out_2[index] = (1-Factor_AM(x)) * mat_ClassifyMe[index]
..some code to output mat_out_1 and mat_out_2
我在np.where和np.argwhere函数上看到了一些看起来很有希望的文档,但鉴于我有超过1个测试(在上面的代码中我有3个,但实际上我有12个)我无法想到一种没有制作非常丑陋的嵌套语句的方法。
还有另一种方法可以做到这一点,还是像Python那样高效?
答案 0 :(得分:1)
您可以将Boolean or “mask” index arrays用于此目的,例如:
import numpy as np
mat = np.arange(16.0).reshape((4,4))
mat_out = np.zeros_like(mat)
mat_out[mat < 6] = 0.2 * mat[mat < 6] # using a conditional for indexing
# or use a variable for the boolean 'masking' index array
mask1 = np.logical_and(mat >= 6, mat < 10)
mat_out[mask1] = 0.3 * mat[mask1]
mask2 = mat >= 10
mat_out[mask2] = 0.5 * mat[mask2]
print mat
print mat < 6
print mask1
print mat_out
答案 1 :(得分:0)
mat = np.array([0.1, 0.2, 5, 4, 9, 0.05, 2, 11]) # an example of input #1
mat_ClassifyMe = np.ones_like(mat) # an example of input #2
mask1 = mat < 1
mask2 = mat >= 8
f = np.empty_like(mat)
f[mask1] = 0.2
f[mask2] = 0.5
f[np.logical_not(mask1 | mask2)] = 0.3
mat_out_1 = f * mat_ClassifyMe
mat_out_2 = (1 - f) * mat_ClassifyMe