【问题标题】:Numpy and Applying Method to a ColumnNumpy 和将方法应用于列
【发布时间】:2019-03-18 00:14:16
【问题描述】:

我有一个包含对象的 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] 列表。

【问题讨论】:

  • a = np.array({'a':1,'b':2},....,{'a':n,'b':n+1}) - 首先,这不是调用np.array 的有效方式,即使用一些合理的东西代替....。其次,你为什么要把一堆字典放在一个数组中? NumPy 的设计不是为了方便或高效地用于这种用途。
  • 此外,在keys() 生成列表的任何 Python 版本上,不保证 dict 顺序。
  • 这只是一个例子。我真的在数组中保存了多个 JSON 响应。

标签: python arrays pandas numpy


【解决方案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 数组的计算不如编译后的数值数组计算快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2022-01-23
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多