Использование itertools для индексации массива - PullRequest
1 голос
/ 24 февраля 2012

Вот часть кода, которая дает мне другой ответ на то, что я ожидал. Строка: print list(x) делает то, что я ожидаю. Я ожидаю, что строка: print random_array[list(x)] будет возвращать значение этого элемента в массиве, но она возвращает три массива. Например, если list(x) вернет [9, 8, 7], будет напечатано random_array[9, :, :], random_array[8, :, :], random_array[7, :, :]. Может кто-нибудь, пожалуйста, объясните мне, почему это? И как я могу получить ожидаемый ответ?

import numpy as np
import itertools

random_array = np.random.randint(0, 9, (10, 10, 10))
my_iterator = itertools.product(range(10),range(10),range(10))

for x in my_iterator:
    print list(x)
    print random_array[list(x)]

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Вы передаете список, а не кортеж:

# What you are doing
random_array[[2, 3, 3]]  # semantics: [arr[2], arr[3], arr[3]]

# What you want to be doing
random_array[(2, 3, 3)]  # semantics: arr[2][3][3], same as arr[2,3,3]

Короче говоря: не приводите свои кортежи к спискам, используя list(...).

1 голос
/ 24 февраля 2012

Как насчет

print random_array[x]

Когда вы передаете список, происходит расширенное индексирование , а это не то, что вам нужно.

1 голос
/ 24 февраля 2012

Я думаю, что вы хотите:

print random_array[x[0], x[1], x[2]]

Если вы передадите список в качестве индекса numpy, он будет повторяться по списку индексов и получит этот фрагмент элементов.Например:

>>> test = numpy.array(range(10))
>>> idx = [1, 2, 3]
>>> test[idx]
array([1, 2, 3])
0 голосов
/ 24 февраля 2012

Вы говорите:

Я ожидаю, что строка: print random_array [list [x]) вернет значение этого элемента в массиве

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

...