我有一个包含对象的numpy数组。
例如,我的数组是:
a = np.array({'a':1,'b':2},....,{'a':n,'b':n+1})
数据不是那么重要,但是我需要为每个列调用该对象上的属性。
以我的词典示例为例,我想调用keys()
以在该行上打印出键列表并以numpy数组形式返回:
a[0].keys()
如果我使用的是Pandas
,则可以在列上利用apply()
并使用lambda函数来执行此操作。对于这种情况,我不能使用Pandas,那么如何在单个numpy数组列上执行相同的操作?
我尝试使用apply_along_axis
,但是lambda整体上一次通过arr
而不是一次,所以我基本上需要在lambda内使用for
循环来获取我的方法。
np.apply_along_axis(lambda b: b.keys(), axis=0, arr=self.data)
上面的代码不起作用! (我知道)。
是否可以使用numpy数组进行pandas.apply()
?
在这种情况下,所需的结果将是N行numpy数组,其中包含[a,b]的列表。
答案 0 :(得分:1)
可以将这样的对象数组视为列表:
In [110]: n=2;a = np.array(({'a':1,'b':2},{'a':n,'b':n+1}))
In [111]: a
Out[111]: array([{'a': 1, 'b': 2}, {'a': 2, 'b': 3}], dtype=object)
In [112]: [d.keys() for d in a]
Out[112]: [dict_keys(['a', 'b']), dict_keys(['a', 'b'])]
您还可以使用frompyfunc
将函数应用于数组的所有元素(或多个数组的广播元素)
In [114]: np.frompyfunc(lambda d:d.keys(),1,1)(a)
Out[114]: array([dict_keys(['a', 'b']), dict_keys(['a', 'b'])], dtype=object)
它返回一个对象数组,在这种情况下可以。 np.vectorize
也使用此功能,但使用一个otypes
参数。
通常,在对象dtype数组上进行迭代比在数字数组上进行迭代要快(因为它要做的只是返回一个指针),但比列表上的等效迭代要慢。对象dtype数组的计算不如编译的数值数组计算快。