Как ссылаться на все строки в numpy.ufunc.at

Как обратиться ко всем строкам или срезу для указанных столбцов в numpy.ufunc.at

это работает для столбцов:

c = np.array([[1,2,4],[5,3,4]])
np.add.at(c, [[0,1],], 999)
print(c)

out:
[[1000 1001 1003]
 [1004 1002 1003]]

но оба они терпят неудачу

c = np.array([[1,2,4],[5,3,4]])
np.add.at(c, [,[0,1]], 999)
print(c)

out:
File "<ipython-input-164-ebab6f97aa81>", line 2
np.add.at(c, [,[0,1]], 999)
              ^
SyntaxError: invalid syntax

или же

c = np.array([[1,2,4],[5,3,4]])
np.add.at(c, [:,[0,1]], 999)
print(c)
out:
File "<ipython-input-165-cef6394c4870>", line 2
    np.add.at(c, [:,[0,1]], 999)
                  ^
SyntaxError: invalid syntax

2 ответа

Решение

В то время как у @Paul есть правильное решение, небольшое объяснение может быть в порядке.

np.add.at(c, [[0,1],], 999)

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

In [197]: [[0,1],]
Out[197]: [[0, 1]]
In [198]: ([0,1],)
Out[198]: ([0, 1],)
In [199]: ([0,1])
Out[199]: [0, 1]

Таким образом, запятая имеет значение; но ведущий выдает ошибку

In [200]: [,[0,1]]    
SyntaxError: invalid syntax

: в списке тоже ошибка. : принимается в выражении индексации, но немедленно преобразуется в slice(None), Индексирование использует [] как список, но это не одно и то же. Второй аргумент .at оценивается Python как список или кортеж, а не как индексное выражение.

np.add.at(c, [:,[0,1]], 999)

In [213]: [:,[0,1]]
SyntaxError: invalid syntax

In [215]: np.add.at(c, [slice(None),[0,1]],999)
In [216]: c
Out[216]: 
array([[1000, 1001,    4],
       [1004, 1002,    4]])

s_ что @Paul предложил работать, потому что это класс с пользовательским методом индексации (__getitem__). Это милый и удобный трюк, но базовый синтаксис Python, который я только что описал, все еще применяется.

In [217]: np.s_[:, [0,1]]
Out[217]: (slice(None, None, None), [0, 1])

Как с индексацией .at колодки с трейлингом slice(None) по мере необходимости, поэтому ваш первый пример работает со строками.

In [224]: np.add.at(c, ([0,1,0], slice(None)),100)
In [225]: c
Out[225]: 
array([[201, 202, 204],
       [105, 103, 104]])

Ты можешь использовать np.s_ вот так:

>>> c = np.array([[1,2,4],[5,3,4]])
>>> np.add.at(c, np.s_[:, [0,1]], 999)
>>> c
array([[1000, 1001,    4],
       [1004, 1002,    4]])
Другие вопросы по тегам