Приведение массивов NumPy к тем же измерениям - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть 2 матрицы, и я хочу выполнить сложение по ячейкам, однако матрицы имеют разный размер.Я хочу сохранить относительные позиции ячеек во время вычисления (т.е. их «координаты» слева вверху), поэтому простое (если не самое лучшее) решение, кажется, заключается в том, чтобы заполнить меньшиеx и y матрицы с нулями.

Этот поток имеет вполне удовлетворительный ответ для конкатенации по вертикали, и это работает с моими данными, и, следуя предложению в ответе, я также добавилhstack, но на данный момент жалуется, что размеры (исключая ось конкатенации) должны точно совпадать.Возможно, hstack не работает так, как я ожидаю, или точно так же, как vstack, но сейчас я немного растерялся.

Это то, что hstack бросает в меня, в то время как vstack, похоже, не имеет проблем.

ValueError: all the input array dimensions except for the concatenation axis must match exactly

По сути, код проверяет, какая из пары матриц короче и / или шире, а затем дополняет меньшую матрицу нулями для соответствия.

Вот код, который у меня есть:

import numpy as np
A = np.random.randint(2, size = (3, 7))
B = np.random.randint(2, size = (5, 10))


# If the arrays have different row numbers:
if A.shape[0] < B.shape[0]:                      # Is A shorter than B?
    A = np.vstack((A, np.zeros((B.shape[0] - A.shape[0], A.shape[1]))))
elif A.shape[0] > B.shape[0]:                    # or is A longer than B?
    B = np.vstack((B, np.zeros((A.shape[0] - B.shape[0], B.shape[1]))))

# If they have different column numbers
if A.shape[1] < B.shape[1]:                      # Is A narrower than B?
    A = np.hstack((A, np.zeros((B.shape[1] - A.shape[1], A.shape[0]))))
elif A.shape[1] > B.shape[1]:                    # or is A wider than B?
    B = np.hstack((B, np.zeros((A.shape[1] - B.shape[1], B.shape[0]))))

Становится поздно, так что возможно, я просто упустил что-то очевидное с hstack, но в данный момент я не вижу своей логической ошибки.

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Я думаю, что ваши hstack строки должны иметь форму

np.hstack((A, np.zeros((A.shape[0], B.shape[1] - A.shape[1]))))

Кажется, что строки и столбцы поменялись местами.

0 голосов
/ 06 декабря 2018

Да, действительно.Вы должны поменять местами (B.shape [1] - A.shape [1], A.shape [0]) на (A.shape [0], B.shape [1] - A.shape [1]) и т. Д.на, потому что вам нужно иметь одинаковое количество строк, чтобы расположить их горизонтально.

0 голосов
/ 06 декабря 2018

Просто используйте np.pad:

np.pad(A,((0,2),(0,3)),'constant') # 2 is 5-3, 3 is 10-7

[[0 1 1 0 1 0 0 0 0 0]
 [1 0 0 1 0 1 0 0 0 0]
 [1 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]

Но ширина 4 пэдов должна быть вычислена;поэтому еще один простой способ дополнить массив 2 в любом случае:

A = np.ones((3, 7),int)
B = np.ones((5, 2),int)

ma,na = A.shape
mb,nb = B.shape
m,n = max(ma,mb) , max(na,nb)

newA = np.zeros((m,n),A.dtype)
newA[:ma,:na]=A

newB = np.zeros((m,n),B.dtype)
newB[:mb,:nb]=B

For:

[[1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1]
 [0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0]] 

[[1 1 0 0 0 0 0]
 [1 1 0 0 0 0 0]
 [1 1 0 0 0 0 0]
 [1 1 0 0 0 0 0]
 [1 1 0 0 0 0 0]]
0 голосов
/ 06 декабря 2018

Попробуйте b[:a.shape[0], :a.shape[1]] = b[:a.shape[0], :a.shape[1]]+a, где b больший массив

Пример ниже

import numpy as np

a = np.arange(12).reshape(3, 4)

print("a\n", a)

b = np.arange(16).reshape(4, 4)

print("b original\n", b)

b[:a.shape[0], :a.shape[1]] = b[:a.shape[0], :a.shape[1]]+a


print("b new\n",b)

output

a
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b original
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
b new
 [[ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]
 [12 13 14 15]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...