python - 在包含数组元素的数据帧上应用 numpy 运算和向量索引的自然方法

标签 python arrays pandas dataframe numpy

我有一个DataFrame它存储 2D array作为第一列和具有三个元素的一维向量作为第二列:

import numpy as np, pandas as pd

A = pd.DataFrame(
    {
      'array': [np.array([[1,2,3],[4,5,6]]), np.array([[7,8,9],[10,11,12]])],
      'vector': [np.array([0.19,0.11,-0.2]), np.array([0.12,0.27,0.4])],
    }, index=['top','bottom'])

我想将整个数组乘以向量最后一个值的符号,以便将原始数组转换为:

                            array              vector
top        [[1, 2, 3], [4, 5, 6]]  [0.19, 0.11, -0.2]
bottom  [[7, 8, 9], [10, 11, 12]]   [0.12, 0.27, 0.4]

对于这个:

                                           array              vector
top     [[-1.0, -2.0, -3.0], [-4.0, -5.0, -6.0]]  [0.19, 0.11, -0.2]
bottom     [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]   [0.12, 0.27, 0.4]

我尝试过的:

A['array'] /= np.sign(A['vector'][2])

但我有一个 KeyError: 2 (可能是因为该数字 2 用于访问行,而不是向量内的值)。
尝试使用此方法访问矢量数据也不起作用:

A['vector'][:,2]
KeyError: 'key of type tuple not found and not a MultiIndex'

那么,是否可以通过自然、简单且接近 numpy 风格的向量运算(即不使用 .apply())来实现这一目标?
因为这是可行的,但对于它的作用来说似乎有点过分了(但我实际上可以忍受它):

 A['array'] /= A['vector'].apply(lambda x: np.sign(x[2]))

%timeit:每次循环 630 µs ± 34.7 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

奇怪的是,这也没有引发著名的error :“尝试在 DataFrame 的切片副本上设置值”。
我其实很期待...

这一切只是一个例子;我可能需要在 DataFrame 中存储为列的某些数组之间应用更多线性代数运算。

我也知道我可以远离 Pandas ' 世界,只停留在 NumPy的,但有时,我很欣赏将数据帧的列标题和行索引充当一些人类可读的指针,特别是在处理复杂的数组时。使用字典也可以,但它们可能不如使用 Pandas(?)那么合适。

最佳答案

尝试通过str.get()np.sign():

A['array']=A['array']*np.sign(A['vector'].str.get(-1))

或者

通过np.vstack()np.sign()尝试:

A['array']=A['array']*np.sign(np.vstack(A['vector'].values)[:,-1])
#you can also use np.stack() in place of np.vstack()

或者

尝试通过mul()map():

A['array']=A['array'].mul(A['vector'].map(lambda x:-1 if x[-1]<0 else 1))

df 的输出:

                                          array              vector
top     [[-1.0, -2.0, -3.0], [-4.0, -5.0, -6.0]]  [0.19, 0.11, -0.2]
bottom     [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]   [0.12, 0.27, 0.4]

关于python - 在包含数组元素的数据帧上应用 numpy 运算和向量索引的自然方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68382438/

相关文章:

python - Flask Python 按钮没有响应

c++ - 在构造函数中零初始化数组数据成员

python-3.x - 唯一索引抛出 : Reindexing only valid with uniquely valued Index objects

python - 根据 pandas 中的 csv 文件名重命名列

python - 根据条件转换数据框的列

python - 预测取决于 Keras 中的批量大小

python - 如何在Python中按第一个和最后一个字符拆分字符串

Javascript更改数组元素的位置

java - 删除最小值后如何基于 "heapify"数组的最小堆?

python - 将列表的 Python 列表转换为字符串