Нарезка с использованием массивов / индексов - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь получить итеративный доступ к массиву с использованием индексов и массивов.Следующий пример в значительной степени подводит итог моей проблемы:

x = np.arange(12)
x.shape = (3,2,2)
nspace = np.array([[0,0], [0,1], [1,0], [1,1]])
for it in range(len(nspace)):
    x[:,nspace(it)] = np.array([1,1,1])

Если бы все работало так, как я думаю, код вывел бы 4 отдельных массива:

[0,4,8]
[1,5,9]
[2,6,10]
[3,7,11]

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

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

EDIT0: мне нужно общее решение, которое требует.мне написать: пробел [0,0], пробел [0,1] и т. д.

EDIT1: я изменил печать на операцию присваивания, потому что на самом деле нужно назначить результат функции, которую явызов внутри цикла.

EDIT2: я не включил Traceback, потому что я сомневаюсь, что это будет полезно.Во всяком случае, вот оно:

Traceback (most recent call last):

  File "<ipython-input-600-50905b8b5c4d>", line 5, in <module>
    print(x[:,nspace(it)])

TypeError: 'numpy.ndarray' object is not callable

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Необходимо указать первый и второй индексы и использовать [] скобки вместо () для доступа к элементам массива.

import numpy as np

x = np.arange(12)
x.shape = (3,2,2)

for it in range(len(nspace)):
    print(x[:,nspace[it][0], nspace[it][1]])

Вывод

[0 4 8]
[1 5 9]
[ 2  6 10]
[ 3  7 11]

Вы также можете использовать reshape непосредственно как

x = np.arange(12).reshape(3,2,2)
0 голосов
/ 29 января 2019

Вам не нужно использовать цикл for.Используйте reshape и transpose.

x.reshape(3, 4).T

Дает:

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

Если вы хотите повторить результат:

for row in x.reshape(3, 4).T:
    print(row)
0 голосов
/ 28 января 2019

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

import numpy as np

x = np.arange(12)
x.shape = (3,2,2)
nspace = np.array([[0,0], [0,1], [1,0], [1,1]])
for it in range(len(nspace)):
    print(x[:,nspace[it]])

РЕДАКТИРОВАТЬ:

И одно возможное решение для получения ожидаемого результата:

import numpy as np

x = np.arange(12)
x.shape = (3,2,2)
nspace = np.array([[0,0], [0,1], [1,0], [1,1]])

y = x.flatten()

for i in range(x.size//x.shape[0]):
    print y[i::4]
...