Python数组,有条件地更改分类上的元素

时间:2013-05-08 09:38:07

标签: python arrays numpy

我有一个数组,想要使用另一个数组更改基于分类的元素。

也就是说,我导入一个数组,然后如果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那样高效?

2 个答案:

答案 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