Как использовать "|"объединить несколько объектов numpy.flatiter - PullRequest
0 голосов
/ 22 ноября 2018

Кто-нибудь знает, почему я не могу использовать «|»объединить несколько объектов numpy.flatiter после преобразования его в набор?Я пытаюсь найти все отображаемые номера во всей строке 11, во всех столбцах 1 и разделах от (2,2) до (3,3), если я использую np.concatenate, я могу получить правильный ответ, но после того, как я использую «|»У меня есть пустой набор?или если есть лучший способ написать это?

import numpy as np
matrix = np.matrix(np.arange(36).reshape(6, 6))
rnum =  matrix[1, :].flat
cnum =  matrix[:, 1].flat
snum = matrix[2:4, 2:4].flat
print(matrix)
print(rnum)
print(set(rnum))
print(set(cnum))
print(set(snum))
print(set(np.concatenate((rnum, cnum, snum))))
print(set(rnum) | set(cnum) | set(snum))
#[[ 0  1  2  3  4  5]
# [ 6  7  8  9 10 11]
# [12 13 14 15 16 17]
# [18 19 20 21 22 23]
# [24 25 26 27 28 29]
# [30 31 32 33 34 35]]
#<numpy.flatiter object at 0x7faf52966c00>
#{6, 7, 8, 9, 10, 11}
#{1, 7, 13, 19, 25, 31}
#{20, 21, 14, 15}
#{1, 6, 7, 8, 9, 10, 11, 13, 14, 15, 19, 20, 21, 25, 31} => expect result
#set() => why?

1 Ответ

0 голосов
/ 22 ноября 2018

Первый вызов set(rnum) в print(set(rnum)) потребляет итератор rnum.Когда вы снова используете set(rnum) в set(rnum) | set(cnum) | set(snum), в итераторе больше не останется значений rnum, поэтому set(rnum) - пустой набор.

Вот более прямая демонстрация:

In [621]: matrix = np.matrix(np.arange(36).reshape(6, 6))

In [622]: rnum =  matrix[1, :].flat

In [623]: set(rnum)
Out[623]: {6, 7, 8, 9, 10, 11}

In [624]: set(rnum)
Out[624]: set()

Вместо использования rnum вы можете создать еще один итератор, повторив matrix[1, :].flat:

In [625]: set(matrix[1, :].flat)
Out[625]: {6, 7, 8, 9, 10, 11}

В качестве альтернативы, пропустите использование numpy.matrix и итераторов и просто внесите в индекс обычнуюМассив NumPy:

In [639]: a = np.arange(36).reshape(6, 6)

In [640]: set(a[1,:])
Out[640]: {6, 7, 8, 9, 10, 11}

In [641]: set(a[:,1])
Out[641]: {1, 7, 13, 19, 25, 31}

In [642]: set(a[2:4, 2:4].ravel())
Out[642]: {20, 21, 14, 15}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...