Вычтите из последней оси ndarray

Если у вас есть проблема в httpd.conf или любых связанных с ним файлах, есть несколько способов узнать, в чем проблема

Сначала посмотрите на свой Windows Event Viewer. Нажмите ссылку Windows в меню слева, а затем подменю Applications. Найдите сообщения из Apache с красным значком ошибки.

Во-вторых, откройте командное окно, затем CD в \ wamp \ bin \ apache \ apache2.x.y \ bin, замените x, y своей фактической версией. Теперь вы можете запустить эту команду, чтобы Apache (httpd) передал файл httpd.conf.

httpd.exe -t

Это должно приводить к ошибкам с номерами строк, связанными с файлом http.conf. Он останавливается при первой ошибке, поэтому вам придется продолжать работать и исправлять ошибку, а затем запускать ее до тех пор, пока она не выдает все сообщение OK.

1
задан yatu 17 March 2019 в 22:02
поделиться

1 ответ

Вы действительно могли бы сделать это, воспользовавшись вещанием .

Давайте начнем с генерации некоторого случайного числа ndarrays указанной формы, чтобы проверить, что конечные размеры соответствуют ожидаемым:

a = np.random.rand(101, 256, 1, 3, 1, 10)
b = np.random.rand(101)

В этом случае вам придется добавить до a.ndim размеры в b, так что каждое значение в b вычитается из каждого из значений в последнем измерении a. Следуя идее этого поста, мы можем сложить до a.ndim новых измерений более кратким способом, используя np.reshape следующим образом:

b = b.reshape((-1,) + (1,)*(a.ndim-1))
print(b.shape)
# (101, 1, 1, 1, 1, 1)

Теперь мы могли бы вычесть b из a как требуется, выполнив:

a[..., 0, None] = a[..., 0, None] - b.reshape((-1,) + (1,) * (a.ndim-1))

И если мы проверим форму a:

print(a.shape)
# (101, 256, 1, 3, 1, 10)

Подробности

]

Вот некоторые пояснения по некоторым вопросам, которые могут возникнуть из предыдущего ответа. Давайте рассмотрим следующий более простой пример:

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

b = np.array([1,1])[:,None]
array([[1],
       [1]])
print(b.shape)
# (2, 1)

Таким образом, для этого примера мы могли бы применить ту же логику, что и решение, приведенное выше:

a[:,0,None] = a[:,0,None] - b

array([[0, 2, 3],
       [3, 5, 6]])

Который, проверяя полученный массив, как Ожидаемый b был вычтен из a по первому указателю вдоль его последней оси, поэтому первый столбец во всех строках.


Итак, первая точка,

Почему мы должны добавить новую ось в a для вычитания?

Необходимо добавить новая ось a, имеющая форму b. Обратите внимание, что b является двумерным массивом array([[1],[1]]), поэтому, если бы вы вычли его непосредственно из a, вы бы получили:

a[..., 0] - b
array([[0, 3],
       [0, 3]])

Итак, здесь произошло то, что Массив меньшего размера, т. е. первый член, представляющий собой просто срез вида 1D из a, array([1, 4]), транслировался по большому массиву, чтобы они имели совместимые формы.

В этом не было бы необходимости, если бы форма b была вместо (2,):

b = np.array([1,1])
a[:,0] - b
# array([0, 3])

Но из-за того, как b было определено фактическое решение, оно имеет столько же размеров, что и в a. Таким образом, чтобы получить правильный вывод, мы должны добавить новую ось к a:

a[:,0,None] - b
array([[0],
       [3]])

Таким образом, мы получим правильный вывод.


При использовании описанного выше метода не представляется возможным присвоить разницу новому массиву, выступающему в качестве «исправленной копии»?

Ответ на этот вопрос можно понять, взглянув на результат вычитания:

c = a[:,0,None] - b
c.shape
(2, 1)

Итак, здесь a[:,0,None] есть то, что называется «разрезанным видом» из a. Итак, обратите внимание, что, присваивая этот результат c, вы сохраняете только фактическое sliced wiew из a, а не весь ndarray. Если вы хотите изменить a в тех же позициях фактического среза, вам нужно будет присвоить его тому же срезанному представлению a, поэтому:

a[:,0,None] = a[:,0,None] - b
print(a.shape)
# (2, 3)

Теперь результат имеет ожидаемый результат, так как мы только изменили срез a. Если вы хотите сохранить копию оригинала ndarray, вы можете использовать np.copy , который будет возвращать фактическую копию, а не фрагмент a, а затем назначать результат для " исправленная копия ":

a_c = np.copy(a)
a_c[:,0,None] = a[:,0,None] - b
0
ответ дан yatu 17 March 2019 в 22:02
поделиться
Другие вопросы по тегам:

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