如何将 (dtype=object) numpy 数组值设置为 Python 列表,而不需要 numpy 将列表解释为值列表?

cge*_*cge 5 python numpy

我有一个 dtype=object 数组,其中值要么是 Python 列表,要么是np.nan.

我想用np.nan[None] (不是 None)替换值。

对于纯 Python 列表,我已经可以使用 来完成此操作[ x if (x is not np.nan) else [None] for x in s ],并且将数组转换为列表对于我的目的来说很好,但出于好奇,我想知道如何使用 numpy 数组来完成此操作。困难在于,当使用索引时,numpy 尝试将任何列表解释为值列表,而不是我想要分配的实际值。

例如,如果我想用 替换这些值2,那很容易(正常的 np、pd 导入;顺便说一句, np.isnan 在这种情况下不起作用,这是选择 float NaN 来表示 pandas 中通用缺失值的弱点,所以我使用 pd.isnull,因为这是针对 pandas 内部的问题):

In [53]: s
Out[53]:
array([['asdf', 'asdf'], ['asdf'], nan, ['asdf', 'asdf', 'asdf'],
       ['asdf', 'asdf', 'asdf']], dtype=object)

In [55]: s[pd.isnull(s)] = 2

In [56]: s
Out[56]:
array([['asdf', 'asdf'], ['asdf'], 2, ['asdf', 'asdf', 'asdf'],
       ['asdf', 'asdf', 'asdf']], dtype=object)
Run Code Online (Sandbox Code Playgroud)

然而,尝试用 [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)
Run Code Online (Sandbox Code Playgroud)

显然,99% 的情况下这是人们想要的行为。恰巧这一次,我想将列表分配为一个对象。有什么办法可以做到吗?

aba*_*ert 4

第一个问题是s[\xe2\x80\xa6] = [None]尝试用一个值的序列 替换数组切片None。您真正想要的是将切片替换为一个值的序列,[None]您可以将其写为[[None]]

\n\n

然而,这并不能真正解决你的问题;这只会让你找到你最初想问的问题。

\n\n

您需要明确地拥有一个包含1 个元素的数组object,该数组恰好是 list [None]。例如:

\n\n
>>> n = np.array([[None], 0], dtype=object)[:1]\n>>> s[pd.isnull(s)] = n\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,当然:

\n\n
>>> n = np.empty((1,), dtype=object)\n>>> n[0] = [None]\n>>> s[pd.isnull(s)] = n\n
Run Code Online (Sandbox Code Playgroud)\n\n

我 90% 确信有一种更简洁、更易读的方法来创建保证具有 value 的 1 元素数组[None],并且 80%​​ 确信有一种更简单的方法可以首先完成整个事情,所以希望有人会来有一个更好的答案\xe2\x80\xa6,但如果没有,这会起作用。

\n