Индексный массив с двумя массивами, заданными началом и концом для каждого столбца - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть двумерный массив A с измерениями NxM. У меня есть два массива, начинающиеся и заканчивающиеся измерениями Nx1

. Для каждой строки k, заданной A [k,:], я хочу установить столбцы с начала [k] до конца [k] в 0:

A[:,start:end]=0

Однако я получаю ошибку

TypeError: only integer scalar arrays can be converted to a scalar index

Если я просто индексирую

A[:,start]=0

, это работает.Но это не то, чего я хочу достичь.

Длина начала [k]: конец [k] отличается для каждого k

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

При длине начального и конечного индексных массивов - starts и ends длин большей длины, мы могли бы создать маску этих мест -

r = np.arange(A.shape[1])
mask = (r >= np.asarray(starts)[:,None]) & (r < np.asarray(ends)[:,None])
A[mask] = 0

Образец цикла -

In [47]: np.random.seed(0)

In [48]: A = np.random.randint(10,100,(4,10))

In [49]: A
Out[49]: 
array([[54, 57, 74, 77, 77, 19, 93, 31, 46, 97],
       [80, 98, 98, 22, 68, 75, 49, 97, 56, 98],
       [91, 47, 35, 87, 82, 19, 30, 90, 79, 89],
       [57, 74, 92, 98, 59, 39, 29, 29, 24, 49]])

In [50]: starts = np.array([2,4,1,0,])

In [51]: ends = np.array([4,7,5,2])

In [52]: r = np.arange(A.shape[1])
    ...: mask = (r >= np.asarray(starts)[:,None]) & (r < np.asarray(ends)[:,None])
    ...: A[mask] = 0

In [53]: A
Out[53]: 
array([[54, 57,  0,  0, 77, 19, 93, 31, 46, 97],
       [80, 98, 98, 22,  0,  0,  0, 97, 56, 98],
       [91,  0,  0,  0,  0, 19, 30, 90, 79, 89],
       [ 0,  0, 92, 98, 59, 39, 29, 29, 24, 49]])

Если начальные, конечные массивы начинаются с малого числа, или если массив A очень большой, то может быть лучше просто зацикливание.

0 голосов
/ 26 сентября 2018

Не знаю, о чем ты говоришь.Это прекрасно работает для меня:

>>> import numpy as np
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> a[:, 1:2] = 0
>>> a
array([[1, 0, 3],
       [4, 0, 6],
       [7, 0, 9]])

Чтобы отладить вашу программу, попробуйте распечатать типы начала и конца до того, как у вас появится

A[:,start:end]=0

. Это может помочь вам найти проблему.

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