Множественные массивы вдоль заданной оси [дубликаты]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

6
задан 4 May 2015 в 14:10
поделиться

2 ответа

Код решения -

import numpy as np

# Given axis along which elementwise multiplication with broadcasting 
# is to be performed
given_axis = 1

# Create an array which would be used to reshape 1D array, b to have 
# singleton dimensions except for the given axis where we would put -1 
# signifying to use the entire length of elements along that axis  
dim_array = np.ones((1,a.ndim),int).ravel()
dim_array[given_axis] = -1

# Reshape b with dim_array and perform elementwise multiplication with 
# broadcasting along the singleton dimensions for the final output
b_reshaped = b.reshape(dim_array)
mult_out = a*b_reshaped

Пример прогона для демонстрации шагов -

In [149]: import numpy as np

In [150]: a = np.random.randint(0,9,(4,2,3))

In [151]: b = np.random.randint(0,9,(2,1)).ravel()

In [152]: whos
Variable   Type       Data/Info
-------------------------------
a          ndarray    4x2x3: 24 elems, type `int32`, 96 bytes
b          ndarray    2: 2 elems, type `int32`, 8 bytes

In [153]: given_axis = 1

Теперь мы хотели бы выполнить поэтапное умножение вдоль given axis = 1. Давайте создадим dim_array:

In [154]: dim_array = np.ones((1,a.ndim),int).ravel()
     ...: dim_array[given_axis] = -1
     ...: 

In [155]: dim_array
Out[155]: array([ 1, -1,  1])

Наконец, измените форму b & amp; выполните элементное умножение:

In [156]: b_reshaped = b.reshape(dim_array)
     ...: mult_out = a*b_reshaped
     ...: 

Еще раз проверьте информацию whos и обратите особое внимание на b_reshaped & amp; mult_out:

In [157]: whos
Variable     Type       Data/Info
---------------------------------
a            ndarray    4x2x3: 24 elems, type `int32`, 96 bytes
b            ndarray    2: 2 elems, type `int32`, 8 bytes
b_reshaped   ndarray    1x2x1: 2 elems, type `int32`, 8 bytes
dim_array    ndarray    3: 3 elems, type `int32`, 12 bytes
given_axis   int        1
mult_out     ndarray    4x2x3: 24 elems, type `int32`, 96 bytes
8
ответ дан Divakar 17 August 2018 в 16:32
поделиться
  • 1
    Хорошо, я виноват, что не упомянул об этом: я не могу создать копии b с соответствующим соответствием размерам, так как может быть очень большим. – user 4 May 2015 в 14:08
  • 2
    Эй, нет, извините, на самом деле это решение, я его неправильно понял. Большое спасибо! – user 4 May 2015 в 14:14
  • 3
    @AJC Все в порядке! Удаление моего предыдущего комментария. – Divakar 4 May 2015 в 14:26
  • 4
    Я всегда удивляюсь тому, насколько мощным является numpy. Круто! Еще раз спасибо. – user 4 May 2015 в 14:27
  • 5
    @AJC Я узнал то же самое в прошлом месяце! :) – Divakar 4 May 2015 в 14:28

Вы можете создать объект среза и выбрать желаемое измерение в этом:

import numpy as np

a = np.arange(18).reshape((3,2,3))
b = np.array([1,3])

ss = [None for i in range(a.ndim)]
ss[1] = slice(None)    # set the dimension along which to broadcast

print ss  #  [None, slice(None, None, None), None]

c = a*b[ss]
2
ответ дан tom10 17 August 2018 в 16:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: