Как я могу заполнить массив наборами - PullRequest
0 голосов
/ 26 июня 2019

Скажем, у меня есть изображение 2x2 пикселей с именем image_array, каждый цвет пикселя идентифицируется набором из 3 записей (RGB), поэтому форма image_array имеет значение 2x2x3.

* 1006.* Я хочу создать массив np.array c, который имеет форму 2x2x1 и последняя координата которого является пустым набором.

Я пробовал это:

import numpy as np
image = (((1,2,3), (1,0,0)), ((1,1,1), (2,1,2)))
image_array = np.array(image)

c = np.empty(image_array.shape[:2], dtype=set)
c.fill(set())
c[0][1].add(124)
print(c)

Я получаю:

[[{124} {124}]
 [{124} {124}]]

И вместо этого я хотел бы получить ответ:

[[{} {124}]
 [{} {}]]

Есть идеи?

Ответы [ 4 ]

1 голос
/ 26 июня 2019

Массив объектов должен быть заполнен отдельными set() объектами.Это означает создание их по отдельности, как я делаю с пониманием списка:

In [279]: arr = np.array([set() for _ in range(4)]).reshape(2,2)                                     
In [280]: arr                                                                                        
Out[280]: 
array([[set(), set()],
       [set(), set()]], dtype=object)

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

Теперь мы можем выполнить операцию набора над одним из этих элементов:

In [281]: arr[0,1].add(124)     # more idiomatic than arr[0][1]                                                                          
In [282]: arr                                                                                        
Out[282]: 
array([[set(), {124}],
       [set(), set()]], dtype=object)

Обратите внимание, что мы не можем оперировать более чем одним набором одновременно.Массив объектов предлагает несколько преимуществ по сравнению со списком.

Это двумерный массив;наборы не образуют измерение.Сравните это с

In [283]: image = (((1,2,3), (1,0,0)), ((1,1,1), (2,1,2))) 
     ...: image_array = np.array(image) 
     ...:                                                                                            
In [284]: image_array                                                                                
Out[284]: 
array([[[1, 2, 3],
        [1, 0, 0]],

       [[1, 1, 1],
        [2, 1, 2]]])

Хотя он начинался с кортежей, он создал трехмерный массив целых чисел.

1 голос
/ 26 июня 2019

Попробуйте это:

import numpy as np

x = np.empty((2, 2), dtype=np.object)
x[0, 0] = set(1, 2, 3)

print(x)
[[{1, 2, 3} None]
 [None None]]

Для нечисловых типов в numpy вы должны использовать np.object.

1 голос
/ 26 июня 2019

всякий раз, когда вы делаете fill(set()), это заполнит массив точно тем же набором, поскольку они ссылаются на тот же набор. Чтобы это исправить, просто сделайте набор, если его нет каждый раз, когда вам нужно добавить в набор

c = np.empty(image_array.shape[:2], dtype=set)
if not c[0][1]:
    c[0,1] = set([124])
else:
    c[0,1].add(124)
print (c)

# [[None {124}]
#  [None None]]
0 голосов
/ 26 июня 2019

Попробуйте изменить свою строку c[0][1].add на эту.

c[0][1] = 124
print(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...