Python инициализируйте np.zeros () и установите значение в index (x) в одну строку - PullRequest
0 голосов
/ 21 февраля 2020

Есть ли способ сделать это

x = np.zeros(10)
x.itemset(7,1)

в одну строку, как эта

y = np.zeros(10).itemset(7,1)

?

Токовый выход

print(x)
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]

print(y)
None

Ответы [ 4 ]

2 голосов
/ 21 февраля 2020

Ну, не напрямую, нет, так как itemset() - это невозвратная функция (вот почему у - None). Правда ли, что две линии плохо? Вы можете сделать это без использования numpy и понимания списка:

 y = [1.0 if i == 7 else 0.0 for i in range(10)]

Однако, как я уже сказал, я бы просто go с дополнительной строкой, поскольку это излишне сложно.

1 голос
/ 21 февраля 2020

Вы можете использовать np.bincount для дополнительной гибкости:

np.bincount([7],[1],10)
# array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])

Например, вы можете установить несколько значений:

np.bincount([1,4,7],[2.1,5,-1],8)
array([ 0. ,  2.1,  0. ,  0. ,  5. ,  0. ,  0. , -1. ])
1 голос
/ 21 февраля 2020

x.itemset(7,1) делает эту операцию вместо . Это означает, что он меняет x, но возвращает None.

По этой причине вы не можете использовать y = np.zeros(10).itemset(7,1) ...

0 голосов
/ 21 февраля 2020

Полностью согласен с ответом Эри c. Однако, если вы настаиваете на одной строке, так как itemset работает на месте, а установка нескольких экземпляров одного и того же изменяемого (например, массива numpy) в списке заставляет все экземпляры указывать на один и тот же массив, мы можем сделать что-то подобное:

y = [x.itemset(7, 1) if i == 0 else x for i, x in enumerate([np.zeros(10)]*2)][1]
print(y)

При первом запуске (i == 0) он устанавливает элемент массива (и возвращает None), а при втором запуске (i == 1) он просто возвращает массив.

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