@Physicist: Простая индексация для одного значения делает копии (в этом случае нечего получить, избегая копирования памяти).

я есть 2D массивA формы(4,3)и одномерный массивa формы(4,), Я хочу поменять местами первые два рядаA, а также первые два элемента вa, Я сделал следующее:

A[0,:],A[1,:] = A[1,:],A[0,:]
a[0],a[1] = a[1],a[0]

Видимо, это работает дляa, но не дляA, Теперь второй ряд становится первым, но первый ряд остается неизменным. Если я сделаю следующее:

first_row_copy = A[0,:].copy()
A[0,:] = A[1,:]
A[1,:] = first_row_copy

Тогда, похоже, работает. Почему первый метод не работает? (но работает наa) А в чем разница междуA_copy = A[0,:].copy() а такжеA_copy = A[0,:]?

Ответы на вопрос(1)

Решение Вопроса

numpy ломтикиПросмотры из базовой памяти, они не делают независимые копии по умолчанию (это оптимизация производительности / памяти). Так:

Делает вид наA[1,:] и вид наA[0,:]затем присваивает значенияA[0,:] чтобы равняться тому, что по мнениюA[1,:], Но когда дело доходит до назначенияA[1,:], A[0,:]Теперь в представлении отображаются данные после копирования, поэтому вы получите неверный результат. Просто добавив.copy для второго элемента здесь было бы достаточно в этом случае:

A[0,:], A[1,:] = A[1,:], A[0,:].copy()

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

 Physicist30 дек. 2017 г., 03:11
тогда почему это работает дляa? Потому что это не кусочки кусочки и поэтому он делает копию по умолчанию?
 ShadowRanger30 дек. 2017 г., 03:14
@Physicist: Простая индексация для одного значения делает копии (в этом случае нечего получить, избегая копирования памяти).

Ваш ответ на вопрос