本次使用set
作品:
In [111]: np.array([tuple(set(i)) for i in v.ravel().tolist()]).reshape(3,3)
Out[111]:
array([[(0, 1, 2), (0, 1, 2, 3), (0, 1, 3)],
[(0, 1, 2, 3), (0, 1, 2, 3), (1, 3)],
[(0, 1, 2, 3), (0, 1, 3), (0, 1, 3)]], dtype=object)
我返回了一个二维元组数组(dtype 对象)。我没有保留结构化数组 dtypes。我也可以返回一个集合数组或集合列表。
或者使用tolist
嵌套的元组列表
In [112]: _.tolist()
Out[112]:
[[(0, 1, 2), (0, 1, 2, 3), (0, 1, 3)],
[(0, 1, 2, 3), (0, 1, 2, 3), (1, 3)],
[(0, 1, 2, 3), (0, 1, 3), (0, 1, 3)]]
我不需要原件tolist
;对 raveled 数组进行迭代就足够了
In [115]: [set(i) for i in v.ravel()]
Out[115]:
[{0, 1, 2},
{0, 1, 2, 3},
{0, 1, 3},
{0, 1, 2, 3},
{0, 1, 2, 3},
{1, 3},
{0, 1, 2, 3},
{0, 1, 3},
{0, 1, 3}]
unique
给出同样的东西;我不能这样做np.unique(i)
,因为它试图使用整个 1 元素结构化数组:
In [117]: [np.unique(i.tolist()) for i in v.ravel()]
Out[117]:
[array([0, 1, 2]),
array([0, 1, 2, 3]),
array([0, 1, 3]),
array([0, 1, 2, 3]),
array([0, 1, 2, 3]),
array([1, 3]),
array([0, 1, 2, 3]),
array([0, 1, 3]),
array([0, 1, 3])]
========================
这会将其转换为 3d 数组
在 [134] 中:v1=v.view(np.dtype('(6,)i4'))
In [135]: v1
Out[135]:
array([[[2, 0, 0, 0, 0, 1],
[1, 0, 3, 2, 1, 2],
[3, 1, 3, 0, 3, 1]],
[[1, 2, 1, 1, 0, 3],
[3, 0, 3, 2, 3, 1],
[1, 3, 1, 1, 3, 3]],
[[0, 2, 3, 3, 1, 1],
[0, 1, 1, 1, 3, 0],
[0, 3, 3, 3, 1, 0]]])
不过,我不确定这是否有帮助。应用于unique
最后一个维度与结构化表单具有相同的问题。
In [137]: [np.unique(i) for i in v1.reshape(-1,6)]
===================== 我在下面写的是一维结构化数组。示例是 2d。当然,它可以被展平,所有这些都适用。
我的第一个想法是将其转换为列表并应用于set
每个元组。它是一个结构化数组,因此v.tolist()
也是一个元组列表。
沿着这条线的东西是我在丹发现的链接中的第一个建议:
https://stackoverflow.com/a/32381082/901925
(重点是计数;bincount
解决方案在这里无济于事。)。
[set(i) for i in v.tolist()]
您甚至可能不需要翻译它,尽管我必须对其进行测试。我不知道结构化记录是否可以作为set
.
[set(i) for i in v]
无论如何,结果将是不同长度的项目列表。它们是集合、列表还是数组并不重要。只有它们不会是结构化数组——除非我们付出额外的努力来识别哪些字段是唯一的。
由于这些字段都是相同的 dtype,因此很容易将其转换为 2d 数组。
v.view(int, 6) # 6 fields
应该做的伎俩(需要测试)。(更正,将其转换为纯 int 数组并不像我想象的那么容易)。
np.unique
应该和set
; 但是我怀疑set
6 个值(或任何其他合理数量的字段)更快。