【问题标题】:Way to create numpy array to contain only unique elements for lists within it创建numpy数组以仅包含其中列表的唯一元素的方法
【发布时间】:2021-06-06 08:53:49
【问题描述】:

我有一个 numpy 数组 A,它看起来像这样:

array([list(['nan', 'nan']),
       list(['nan', 'nan', 'apple', 'apple', 'banana', 'nan', 'nan']),
       list(['red', 'red']), ...,
       list(['nan', 'festival'])], dtype=object)

我想将其转换为一个数组,其中每个列表仅包含唯一元素。例如,我希望将上面的数组转换为:

['nan'],['nan','apple','banana'],['red'],...,['nan','festival']

我试过这样做:

output = []
for i in A:
    output.append(np.unique(i))
output

我不需要这样做的输出,目前看起来像这样:

[array(['nan'], dtype='<U3'),
 array(['nan'], dtype='<U3'),
 array(['nan'], dtype='<U3'),....]

可以做什么?

【问题讨论】:

  • 这段代码对我来说是[array(['nan'], dtype='&lt;U3'), array(['apple', 'banana', 'nan'], dtype='&lt;U6'), array(['red'], dtype='&lt;U3'), array([Ellipsis], dtype=object), array(['festival', 'nan'], dtype='&lt;U8')]
  • 是的,但是我们可以删除 [array([..],dtype='['nan'],['nan','apple','banana'],['red'],...,['nan','festival']
  • 使用列表代替数组,使用set代替unique

标签: python list numpy


【解决方案1】:
arr=np.array([list(['nan', 'nan']),
       list(['nan', 'nan', 'apple', 'apple', 'banana', 'nan', 'nan']),
       list(['red', 'red']), ...,
       list(['nan', 'festival'])], dtype=object)

通过列表理解尝试:

out=[np.unique(x).tolist() for x in arr]

out=[list(np.unique(x)) for x in arr]

out的输出:

[['nan'], ['apple', 'banana', 'nan'], ['red'], [Ellipsis], ['festival', 'nan']]

【讨论】:

  • 这正是我得到的输出。我正在寻找的是获得一个仅包含唯一值而不包含其他信息(例如 dtype)的输出。
  • 这不是 OP 想要的,['nan','apple','banana'] 应该保留在同一个列表中。
  • @user31934 更新答案...请看一下:)
  • [ list(set(x)) for x in ...] 应该更快。
  • 您的复制粘贴包括...
【解决方案2】:

简单的非 numpy 答案

In [239]: alist =[list(['nan', 'nan']),
     ...:        list(['nan', 'nan', 'apple', 'apple', 'banana', 'nan', 'nan']),
     ...:        list(['red', 'red']),
     ...:        list(['nan', 'festival'])]
In [240]: alist
Out[240]: 
[['nan', 'nan'],
 ['nan', 'nan', 'apple', 'apple', 'banana', 'nan', 'nan'],
 ['red', 'red'],
 ['nan', 'festival']]
In [241]: [list(set(i)) for i in alist]
Out[241]: [['nan'], ['banana', 'apple', 'nan'], ['red'], ['festival', 'nan']]

numpy 会更慢。

您的迭代应该没有任何问题:

In [245]: output = []
     ...: for i in np.array(alist,object):
     ...:     output.append(np.unique(i))
     ...: output
Out[245]: 
[array(['nan'], dtype='<U3'),
 array(['apple', 'banana', 'nan'], dtype='<U6'),
 array(['red'], dtype='<U3'),
 array(['festival', 'nan'], dtype='<U8')]

np.unique 是一个numpy 函数,因此返回一个数组,而不是一个列表。对于像这样的简单情况,使用字符串列表,set 可以工作并且速度更快。

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2022-01-07
    • 1970-01-01
    • 2012-02-26
    • 2011-01-07
    相关资源
    最近更新 更多