假设我有一个名为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)
有什么想法吗?
答案 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)