两个numpy ndarray的数值运算

时间:2016-02-12 23:44:32

标签: python numpy

我有两个numpy 2-D阵列 - A,B具有相同的尺寸(n x n)。我想查看两个数组上的每个单元格并进行一些条件运算并返回一个新的2_D数组(C)。

例如,如果A[i, j] = 0.0B[i, j]= 0.0,我想填充C[i, j] = 1.0。如果单元格值不同,那么我必须填充C[i, j] = f(A[i, j], B[i, j])。可能还有一些if条件。

我可以做蛮力循环,但是,它既不是Pythonic也不是优雅的方式。我正在阅读关于矢量化/从函数等,...但是,不清楚如何去做。

有什么建议吗?欣赏它。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以通过计算整个矩阵的f来实现此目的,然后返回并将值1.0分配给a和b中的==索引:

a= np.random.randn(3, 3)
b= np.random.randn(3, 3)
c= np.zeros((3,3))

a[0,0]= 0 # for your example 
b[0,0]= 0

In [532]: a
Out[532]:
array([[ 0.        ,  0.41134107, -0.58869891],
       [ 0.09898662, -1.79136973,  1.28057148],
       [ 0.14666895, -0.7022536 ,  0.07162134]])

In [533]: b
Out[533]:
array([[ 0.        , -0.19669429, -0.82305814],
       [ 1.45526312,  1.7483546 ,  0.41721631],
       [ 0.50303962, -0.03359472,  0.09301669]])

定义你的功能:

def f(x,y):
    return ((x+1.0) + (y+1.0))

将其应用于整个矩阵:

c = f(a,b)

现在返回并将{1.0}的值分配给a==b

c[a==b] = 1.0

结果:

In [538]: c
Out[538]:
array([[ 1.        ,  2.21464677,  0.58824296],
       [ 3.55424975,  1.95698487,  3.69778778],
       [ 2.64970858,  1.26415167,  2.16463802]])

答案 1 :(得分:0)

我不确定这究竟是什么,但我经常将其称为魔术索引。给定两个矩阵A和B,它们完全相等,除了它们的最后一列和最左边的值(索引(0,0))。我首先找到它们的值相等的索引使用==测试。这返回一个可以使用的布尔矩阵。然后我预先初始化结果矩阵C.

#initialize two identical 2d arrays
A = np.array([np.arange(10) for i in range(5)])
B = np.array([np.arange(10) for i in range(5)])

A[0,0] = -1
A[:,-1] = range(10,15)
B[:,-1] = 1
#now everything but the last column is the same and upper left corner

equal_mat = A == B
print equal_mat #boolean matrix

def someFun(A, B):
    toRet = A*B +1
    return toRet
C = np.zeros(A.shape) #initialize result matrix
C[equal_mat] = 0.0 #set result to zero wherever A == B
opp = np.logical_not(equal_mat) # get the opposite indices
C[opp] = someFun(A[opp], B[opp]) # assign the output of a function
print C  #zero everywhere except index (0,0) and the last column

请注意,someFun必须接受两个shape(m,)数组并返回一个shape(m,)数组。希望有所帮助。