如何返回与dtype=object
的np.array
中的uniques相对应的索引列表?
类似于:
arr = np.array(["one", "one", 2, 2])
result = np.unique(arr, return_inverse=True)[1]
print(result)
# [1, 1, 0, 0]
但包括NaN
值和在索引期间被忽略的值:
arr = np.array([nan, "one", 2, 2])
result = np.unique(arr, return_inverse=True)[1]
print(result)
# TypeError: '<' not supported between instances of 'float' and 'str'
我已经尝试过以下操作:
arr = np.array([nan, "one", 2, 2])
result = np.unique(arr[~np.isnan(arr)], return_inverse=True)[1]
print(result)
# TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the
我想从上面的例子中得到什么:
arr = np.array([nan, "one", 2, 2])
result = #...
print(result)
# [nan, 1, 0, 0]
请注意,arr
属于dtype=object
,因为它包含变量数据类型int
和str
。
提前谢谢!
在第一个例子中,数组是字符串dtype:
In [293]: arr = np.array(["one", "one", 2, 2])
In [294]: arr
Out[294]: array(['one', 'one', '2', '2'], dtype='<U21')
In [295]: np.unique(arr)
Out[295]: array(['2', 'one'], dtype='<U21')
如果我们指定对象数据类型
In [298]: arr = np.array(["one", "one", 2, 2], object)
In [299]: arr
Out[299]: array(['one', 'one', 2, 2], dtype=object)
In [300]: np.unique(arr)
Traceback (most recent call last):
...
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/arraysetops.py", line 333, in _unique1d
ar.sort()
TypeError: '<' not supported between instances of 'int' and 'str'
请注意回溯中的排序。
你的nan
是什么?
In [306]: arr = np.array([nan, "one", 2, 2])
Traceback (most recent call last):
File "<ipython-input-306-abe4f4fe7b97>", line 1, in <module>
arr = np.array([nan, "one", 2, 2])
NameError: name 'nan' is not defined
In [307]: arr = np.array([np.nan, "one", 2, 2])
In [308]: arr
Out[308]: array(['nan', 'one', '2', '2'], dtype='<U32')
nan
是一个浮点:
In [309]: arr = np.array([np.nan, 3, 2, 2])
In [310]: arr
Out[310]: array([nan, 3., 2., 2.])
In [311]: np.unique(arr)
Out[311]: array([ 2., 3., nan])
浮动上的unique
可能很棘手,因为浮动并不总是";等于";如果
np.unique
使用对nan
有一些特殊处理的np.lib.arraysetops._unique1d
(因为nan
不等于任何东西,甚至不等于它自己(。
样本字符串排序
In [321]: np.sort(['one','a','B','','_',' '])
Out[321]: array(['', ' ', 'B', '_', 'a', 'one'], dtype='<U3')
我已经有一段时间没有研究字符串排序(ASCII字符(了,所以不能确切地说出顺序是什么