如何将(dtype=object)numpy数组值设置为Python列表,而不将列表解释为值列表?
我有一个dtype=object数组,其中的值要么是Python列表,要么是如何将(dtype=object)numpy数组值设置为Python列表,而不将列表解释为值列表?,python,numpy,Python,Numpy,我有一个dtype=object数组,其中的值要么是Python列表,要么是np.nan 我想将np.nan中的值替换为[None](不是None) 对于纯Python列表,我已经可以使用[x if(x不是np.nan)else[None]为x in s]实现这一点,并且将数组转换为列表对于我来说是很好的,但是出于好奇,我想知道如何使用numpy数组实现这一点。困难在于,在使用索引时,numpy试图将任何列表解释为值列表,而不是我想要指定的实际值 例如,如果我想将值替换为2,这很容易(正常的np
np.nan
我想将np.nan
中的值替换为[None](不是None)
对于纯Python列表,我已经可以使用[x if(x不是np.nan)else[None]为x in s]
实现这一点,并且将数组转换为列表对于我来说是很好的,但是出于好奇,我想知道如何使用numpy数组实现这一点。困难在于,在使用索引时,numpy试图将任何列表解释为值列表,而不是我想要指定的实际值
例如,如果我想将值替换为2
,这很容易(正常的np、pd导入;顺便说一句,np.isnan在这种情况下不起作用,这是pandas中选择float NaN作为泛型缺失值的弱点,因此我使用pd.isnull,因为这是pandas内部的问题):
但试图用[None]替换它们,却用None替换它们:
In [58]: s
Out[58]:
array([['asdf', 'asdf'], ['asdf'], nan, ['asdf', 'asdf', 'asdf'],
['asdf', 'asdf', 'asdf']], dtype=object)
In [59]: s[pd.isnull(s)] = [None]
In [60]: s
Out[60]:
array([['asdf', 'asdf'], ['asdf'], None, ['asdf', 'asdf', 'asdf'],
['asdf', 'asdf', 'asdf']], dtype=object)
显然,这是一个人99%的时候想要的行为。碰巧这次,我想将列表指定为一个对象。有什么方法可以这样做吗?第一个问题是
s[…]=[None]
试图用一个值的序列替换数组切片,None
。您实际想要的是用一个值的序列替换切片,[None]
,您将其写成[[None]]
然而,这并不能真正解决你的问题;这只会让你想到你一开始就想问的问题
您需要的是一个由1个对象
元素组成的数组,该元素恰好是列表[None]
。例如:
>>> n = np.array([[None], 0], dtype=object)[:1]
>>> s[pd.isnull(s)] = n
或者,当然:
>>> n = np.empty((1,), dtype=object)
>>> n[0] = [None]
>>> s[pd.isnull(s)] = n
我90%确信有一种更简洁易读的方法来创建一个保证值
[None]
的1元素数组,80%确信有一种更简单的方法来完成整个任务,所以希望有人能想出一个更好的答案……但如果没有,这将起作用。我建议使用numpy.argmin()
,因为它返回nan
的位置,然后用[None]
替换它们,方法如下:
将numpy导入为np
作为pd进口熊猫
def到_none(阵列_):
对于范围内的i(数组大小[pd.isnull(数组大小)]:
数组\[np.argmin(数组\)]=[无]
返回数组_
a=np.array([['asdf','asdf'],['asdf'],np.nan,['asdf','asdf','asdf'],np.nan,
['asdf','asdf','asdf']],数据类型=对象)
a=至无(a)
打印
>>
[['asdf','asdf']['asdf'][None]['asdf','asdf','asdf'][None]
['asdf','asdf','asdf']]
打印a.D类型
>>
对象
您始终可以显式地将列表包装为恰好是列表的一个对象的标量数组,就像包装s
本身一样。但这是可怕的丑陋;希望有人有一个更好的答案……如果你的所有元素都是list
s,你可以在适当的位置修改列表(使用[:]=…
),但遗憾的是,这在这里没有帮助,因为你显然不能在适当的位置将nan
修改为[None]
。
>>> n = np.empty((1,), dtype=object)
>>> n[0] = [None]
>>> s[pd.isnull(s)] = n