2015-09-03 12 views
-1
# *-* coding: utf-8 *-* 

import numpy as np 
import scipy as sc 

A = np.array([[1,1], [1,2], [3,1]]) 
B = np.array([[2,3], [3,2], [1,4]]) 

print (A==B).all() 
print np.array_equal(A, B) 
print np.array_equiv(A, B) 
print np.allclose(A, B) 

Но они просто говорят «False», но я могу добавить эти два массива. Я должен проверить, разрешено ли добавление/умножение (измерение?), А если нет, я должен выдать ошибку.Python: как проверить, могут ли быть добавлены два массива?

+2

... Что? Вы хотите проверить размеры? Когда вы пытаетесь добавить массивы с неравными размерами, numpy будет вызывать ошибку. –

+2

Вы можете «попробовать» [EAFP] (https://docs.python.org/3.5/glossary.html#term-eafp) 'except', вы, вероятно, не знаете, что это (пока). –

ответ

4
import numpy as np 

A = np.array([[1, 1], [1, 2], [3, 1]]) 
B = np.array([[2, 3], [3, 2], [1, 4]]) 
C = np.array([[1, 2], [3, 4]]) 

# same shapes --> operations are not a problem 
print(A+B) 
print(A*B) 

# shapes differ --> numpy raises ValueError 
print(A+C) 
print(A*C) 

ValueError поднятый NumPy, как следующее:

ValueError: operands could not be broadcast together with shapes (3,2) (2,2)

Как вы можете видеть, формы проверяются numpy перед выполнением любой операции массива.

Однако, если вы хотите сделать это вручную, или хотите, чтобы поймать исключение, поднятый numpy вы можете сделать что-то вроде этого:

# prevent numpy raising an ValueError by prooving array's shapes manually before desired operation 
def multiply(arr1, arr2): 
    if arr1.shape == arr2.shape: 
     return arr1 * arr2 
    else: 
     print('Shapes are not equal. Operation cannot be done.') 

print(multiply(A, B)) 
print(multiply(A, C)) 

# prevent numpy raising an ValueError by prooving array's shapes manually before desired operation 
def add(arr1, arr2): 
    if arr1.shape == arr2.shape: 
     return arr1 + arr2 
    else: 
     print('Shapes are not equal. Operation cannot be done.') 

print(add(A, B)) 
print(add(A, C)) 


# catch the error/exception raised by numpy and handle it like you want to 
try: 
    result = A * C 
except Exception as e: 
    print('Numpy raised an Exception (ValueError) which was caught by try except.') 
else: 
    print(result)  
2

проверить, является ли форма будет соответствовать для этого прибавление, трюк будет заниматься вещанием, поскольку вещание позволяет добавлять массивы с неравными формами. Чтобы проверить это, можно использовать np.broadcast.

Вот пример:

a = np.array([[1, 2], [3, 4], [5, 6]]) 
b = np.array([1, 2, 3]) 

a + b # raises value error 
np.broadcast(a, b) # raise value error 

a + b[:,None] # does the addition with broadcasting 
np.broadcast(a, b[:,None]) # returns a valid broadcast object 

Если a и b имеют одинаковую форму и могут быть непосредственно добавлены, np.broadcast также вернет правильный объект, не вызывая исключение.