Заполните массив Numpy в соответствии со значениями двух разных массивов - PullRequest
1 голос
/ 01 ноября 2019

У меня есть два массива 5x5x3:

A = np.random.randint(0, 255, (5,5,3), np.uint8)
B = np.random.randint(0, 255, (5,5,3), np.uint8)

, и мне нужно заполнить третий массив C (такой же формы A и B), заполнив его значения из A или B в соответствии со значениями в A.

Чистый код Python должен быть:

C = np.zeros(A.shape, dtype=np.uint8) 
h, w, ch = C.shape

for y in range(0, h):
    for x in range(0, w):
        for z in range(0, ch):
            if A[y, x, z] > 128:
                C[y, x, z] = max(A[y, x, z], B[y, x, z])
            else:
                C[y, x, z] = min(A[y, x, z], B[y, x, z])

Приведенный выше код работает, но он очень медленный с большими массивами. Моя попытка с numpy была следующей:

C = np.zeros(A.shape, dtype=np.uint8) 
C[A>128] = max(A,B)
C[A<128] = min(A,B) 

, но результат был:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

С помощью np.where вы можете избежать создания пустого массива раньше. np.maximum, np.minimum возвращаемые массивы, имеющие ту же форму, что и A и B. Условие A> 128 выберет из них правильные значения

С = np.where(A>128, np.maximum(A,B), np.minimum(A,B))
0 голосов
/ 01 ноября 2019

Минус / макс. Функции Pythons, кажется, не работают поэлементно на нудистых ndarrays (которые, кажется, вы ищете)

Вы должны иметь возможность использовать np.maximum и np.minimum вместо этого

C[A>128] = np.maximum(A,B)[A>128]
C[A<=128] = np.minimum(A,B)[A<=128]
0 голосов
/ 01 ноября 2019

Попробуйте следующий код:

C = np.zeros(shape=A.shape)
C = (A>128)*np.maximum(A,B)+(A<=128)*np.minimum(A,B)

Это было в 5 раз быстрее для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...