如何用集合填充数组

时间:2019-06-26 15:25:28

标签: python-3.x numpy set

假设我有一个名为2x2的{​​{1}}个像素的图像,每个像素颜色由3个条目(RGB)的元组标识,所以image_array的形状为{{1 }}。

我想创建一个形状为image_array且最后一个坐标为空集的np.array 2x2x3

我尝试过:

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)

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

每当您执行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]]

答案 1 :(得分:1)

尝试一下:

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

答案 2 :(得分:1)

对象数组必须用单独的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]]])

虽然它以元组开头,但是却形成了一个3d的整数数组。

答案 3 :(得分:-2)

尝试将您的行c[0][1].add更改为此。

c[0][1] = 124
print(c)