如何将(dtype=object)numpy数组值设置为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

我有一个dtype=object数组,其中的值要么是Python列表,要么是
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