2016-02-12 2 views
1

У меня есть два numpy 2-D массива - A, B, которые имеют одинаковые размеры (n x n). Я хочу посмотреть каждую ячейку на обоих массивах и выполнить некоторую условную арифметику и вернуть новый массив 2_D (C).числовая операция на двух numpy ndarrays

Например, если A[i, j] = 0.0 и B[i, j]= 0.0, то, я хочу заполнить C[i, j] = 1.0. Если значения ячейки различны, тогда я должен заполнить C[i, j] = f(A[i, j], B[i, j]). Может быть еще несколько условий if.

Я могу сделать переборку, но она не является ни путинской, ни изящной. Я читаю о векторизации/из-функций и т. Д., Но, неясно, как это сделать.

Любые предложения? ценить это.

Спасибо.

ответ

2

Вот как вы можете сделать это путем расчета f для всей матрицы, а затем вернуться и присвоить значение 1.0 для индексов == с и Ь:

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]]) 
+0

очень просто! благодаря! – user1717931

0

Я не уверен, что именно это называется, но я часто называю его магическим индексированием. Для двух матриц A и B, где они полностью равны, за исключением последнего столбца и самого верхнего левого значения (индекс (0,0)). Сначала я обнаружил, что индексы, где их значения равны, используют тест ==. Это возвращает логическую матрицу, которая может быть использована. Тогда я preinitialize результирующей матрицы 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 должна принимать в двух массивах формы (м,) и вернуть единый массив формы (м,). Надеюсь, это поможет.

Смежные вопросы