Присвоить значение нескольким срезам в numpy

В Matlab вы можете присвоить значение нескольким фрагментам одного и того же списка:

>> a = 1:10

a =

     1     2     3     4     5     6     7     8     9    10

>> a([1:3,7:9]) = 10

a =

    10    10    10     4     5     6    10    10    10    10

Как вы можете сделать это в Python с массивом numpy?

>>> a = np.arange(10)

>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a[1:3,7:9] = 10
IndexError: too many indices

person gozzilli    schedule 29.04.2013    source источник
comment
Любая причина, по которой вы можете захотеть сделать это в одном выражении, а не в двух?   -  person Sukrit Kalra    schedule 29.04.2013
comment
@SukritKalra Я не могу говорить за автора вопроса, но в качестве примера можно привести случай, когда кто-то пытается сформировать понимание списка из такого мультифрагмента (это то, что я пытаюсь сделать и почему я пришел к этому вопросу)   -  person Pyderman    schedule 17.05.2016


Ответы (3)


a = np.arange(10)
a[[range(3)+range(6,9)]] = 10
#or a[[0,1,2,6,7,8]] = 10 

print a

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

person Joran Beasley    schedule 29.04.2013
comment
Можно ли этого добиться без NumPy? - person Pyderman; 17.05.2016
comment
Верно. NumPy — настоящий король однострочников. - person Pyderman; 18.05.2016

Вы также можете рассмотреть возможность использования np.r_:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.r_.html

ii = np.r_[0:3,7:10]
a[ii] = 10

In [11]: a
Out[11]: array([ 10, 10, 10,  3,  4,  5,  6, 10, 10,  10])
person JoshAdel    schedule 29.04.2013

Из http://docs.scipy.org/doc/numpy/user/basics.indexing.html (раздел «Индексные массивы»). Обратите внимание, что индексы для желаемых срезов должны содержаться в 'np.array()'.

>>> x = np.arange(10,1,-1)
>>> x
array([10,  9,  8,  7,  6,  5,  4,  3,  2])

>>> x[np.array([3, 3, 1, 8])]
array([7, 7, 9, 2])
person Taha H.    schedule 07.11.2015