«Ошибка значения: фигуры (1,4) и (1,4) не выровнены: 4 (dim 1) ! = 1 (dim 0)», но размеры массива одинаковы

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

 import numpy as np

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

def np2dOperations(arr):
    a = arr[0:1]
    print(a)
    b = arr[1:2]
    print(b)
    c = arr[2:3]
    print(c)
    d = arr[3:4]
    print(d)
    e = np.matmul(a,c)
    print(e, "e")
    f = b*d
    x = e.sum()
    y = np.amax(f)
    print(x)
    print(y)
    print(x-y)
    return x-y

np2dOperations(arr)
  

мой вывод:

 [[1 1 2 2]]
[[1 1 2 2]]
[[3 3 4 4]]
[[3 3 4 4]]
Traceback (most recent call last):
  File "/Users/bethanne/Documents/NumPy2DOperations.py", line 24, in <module>
    np2dOperations(arr)
  File "/Users/bethanne/Documents/NumPy2DOperations.py", line 14, in np2dOperations
    e = np.matmul(a,c)
ValueError: shapes (1,4) and (1,4) not aligned: 4 (dim 1) != 1 (dim 0)
  

Я продолжаю получать следующую ошибку «Ошибка значения: фигуры (1,4) и (1,4) не выровнены: 4 (dim 1) ! = 1 (dim 0)», хотя массивы a и c имеют одинаковый размер. Результат должен быть 16 от xy. Я попытался использовать np.transpose для массива a, но это тоже не сработало. Я новичок в программировании с помощью numpy и python, поэтому, пожалуйста, объясните, что я делаю неправильно. Спасибо!

Комментарии:

1. Если вы хотите выполнить умножение матрицы, то вам следует выполнить np.matmul(a, c.T) или np.matmul(a.T,c) . Если вам нужен поэлементный продукт, то вы могли бы просто сделать a*c или np.dot(a,c)

Ответ №1:

Итак, вы начинаете с массива 4×4:

 In [17]: arr = np.array([[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]])
In [18]: arr
Out[18]: 
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4]])
In [19]: arr.shape
Out[19]: (4, 4)
  

Индексирование с помощью среза сохраняет 2d-форму:

 In [20]: a = arr[0:1]
In [21]: a
Out[21]: array([[1, 1, 2, 2]])
In [22]: a.shape
Out[22]: (1, 4)
  

Индексация с помощью скаляра уменьшает размеры на 1

 In [23]: a1 = arr[0]
In [24]: a1
Out[24]: array([1, 1, 2, 2])
In [25]: a1.shape
Out[25]: (4,)
  

matmul для одномерных массивов четко задокументировано:

 In [26]: np.matmul(arr[0],arr[1])
Out[26]: 10
In [27]: 
In [27]: np.matmul(arr[0],arr[2])
Out[27]: 22
  

matmul для 2d-массивов также четко задокументировано, и требования четко указаны в ошибке:

 In [28]: np.matmul(arr[0:1],arr[2:3])
Traceback (most recent call last):
  File "<ipython-input-28-88ee2e80387e>", line 1, in <module>
    np.matmul(arr[0:1],arr[2:3])
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 4)
  

matmul из (1,4) с (4,1) работает, получая тот же результат, что и 1d «точка», за исключением того, что результатом является (1,1) массив:

 In [29]: np.matmul(arr[0:1],arr[2:3].T)
Out[29]: array([[22]])
  

Поэлементное умножение:

 In [30]: arr[1]*arr[3]
Out[30]: array([3, 3, 8, 8])
In [31]: arr[1:2]*arr[3:4]
Out[31]: array([[3, 3, 8, 8]])
  

и так далее для других ваших выражений. numpy Существует четкое различие между одномерными массивами и двумерными. Массив с формой (n,) отличается от формы (1, n) или (n,1), хотя они могут быть изменены друг на друга.