2015-05-24 82 views
4

我有一個dtype = object的數組,其值爲Python列表或np.nan如何將(dtype = object)numpy數組值設置爲Python列表,而不用numpy將列表解釋爲值列表?

我想用[無](而不是無)替換值爲np.nan

對於一個純Python列表,我已經可以用[ x if (x is not np.nan) else [None] for x in s ]做到這一點,並且將數組轉換爲列表對我的目的來說很好,但出於好奇,我不知道如何用一個numpy數組完成這項工作。困難在於,當使用索引時,numpy會嘗試將任何列表解釋爲值列表,而不是我想要分配的實際值。

例如,如果我想用2替換這些值,那很容易(正常np,pd imports;順便說一句,np.isnan在這種情況下不起作用,這是一個弱點,在大熊貓一般的缺失值,所以我用pd.isnull,因爲這是與大熊貓內部的問題,反正):

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) 

然而,試圖與以取代他們[無],而不是取代他們無:

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%的時間。恰巧這次發生,我想把這個列表作爲一個對象。有沒有辦法做到這一點?

+0

你總是可以明確地包裹列表向上的恰好一個對象的標量數組成爲一個列表,就像你自己包裹了's'一樣。但這太可怕了,希望有人有更好的答案...... – abarnert

+0

如果你的元素的_all_是'list's,你可以用[[:] = ...'來修改這個列表),但是很遺憾這在這裏不會有幫助,因爲你很明顯不能將'nan'變成'[None]'。 – abarnert

回答

3

第一個問題是s[…] = [None]嘗試用一個值的序列None來替換陣列片。你真正想要的是用一個值[None]的序列替換片段,你會寫爲[[None]]

但是,這不會真正解決您的問題;這只是讓你首先想到的問題。

你需要有明確的數組 of 1 object元素碰巧是名單[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%的人確實有一個簡單的方法來完成整個事情,所以希望有人會提出更好的答案......但如果沒有,這將起作用。

0

我會建議使用numpy.argmin(),因爲它返回的nan位置和比[None]取代它們是這樣的:

import numpy as np 
import pandas as pd 

def to_none(array_): 
    for i in range(array_[pd.isnull(array_)].size): 
     array_[np.argmin(array_)] = [None] 
    return array_ 


a = np.array([['asdf', 'asdf'], ['asdf'], np.nan, ['asdf', 'asdf', 'asdf'],np.nan, 
     ['asdf', 'asdf', 'asdf']], dtype=object) 
a = to_none(a) 

print a 

>> 
[['asdf', 'asdf'] ['asdf'] [None] ['asdf', 'asdf', 'asdf'] [None] 
['asdf', 'asdf', 'asdf']] 

print a.dtype 

>> 
object 
相關問題