乘以 np.array 结构中表示的每一行的元素(元组)的有效 pythonic 方法

Efficient pythonic way to multiply elements(which are tuple) of each row represented in np.array structure

数据表示如下。这里的数据有 3 列(作为示例),但一般情况下,数据会有更多列

data_set = np.array([[1, (1, 2.5), (2, 3)], [2, (2, 5.7), (1.6, 4.1)], [3, (3, 7.3), (5, 6)], [4, (6, 9.1), (1.6, 2.5)]])

[[1 (1, 2.5) (2, 3)]
 [2 (2, 5.7) (1.6, 4.1)]
 [3 (3, 7.3) (5, 6)]
 [4 (6, 9.1) (1.6, 2.5)]]

丢弃第一列我想乘以每行的其余元素。这里列中的值(第一个除外)表示为元组。所以要乘法,我必须先解压元组,然后减去(需要对所有列执行此操作),然后乘法。因此,例如,如果我考虑第一行,我应该得到以下答案

Column 1 row 1 -> 2.5 - 1 = 1.5 
Column 2 row 1 -> 3   - 2 = 1 
1.5*1 = 1.5

然后将值存储在字典中,其中

Key = 1(the value of Column 0 row 1) and Value = 1.5(the product)

我可以用基本的方式做到这一点,但想知道是否有任何有效的 pythonic 方式来做到这一点。

这似乎是一个 pythonic 和直接的解决方案:

import numpy as np

data = np.array(
      [[1, (1, 2.5), (2, 3)],
       [2, (2, 5.7), (1.6, 4.1)],
       [3, (3, 7.3), (5, 6)],
       [4, (6, 9.1), (1.6, 2.5)]]
)

result = {a: (c - b) * (e - d) for a, (b, c), (d, e) in data}

print(result)

输出:

{1: 1.5, 2: 9.249999999999998, 3: 4.3, 4: 2.7899999999999996}

如果这是您需要的数据格式,那么构建字典的性能很难超过这样的理解。

您可以使用纯 numpy 和一个 numpy 数组作为输出格式更快地构建一些东西,但即使对于中等大小的输入,我也可能更喜欢这个非常易读的解决方案。

请注意,如果一行中的元组数量是可变的(或只是很大),我会这样解决:

import numpy as np
from functools import reduce

data = np.array(
      [[1, (1, 2.5), (2, 3)],
       [2, (2, 5.7)],
       [3, (3, 7.3), (5, 6), (6, 1), (.5, 1)],
       [4, (6, 9.1), (1.6, 2.5)]]
)

result = {row[0]: reduce(lambda acc, t: acc * (t[1] - t[0]), row[1:], 1) for row in data}

print(result)

可读性稍有下降,但现在它适用于任意数量的元组列,即使每一行的列数不同。

另一个小更新 - 自 Python 3.8 以来,有一个标准函数用于对可迭代对象的所有元素进行乘法运算,因此在这种情况下您可以使用它代替 .reduce()

import numpy as np
from math import prod

data = np.array(
      [[1, (1, 2.5), (2, 3)],
       [2, (2, 5.7)],
       [3, (3, 7.3), (5, 6), (6, 1), (.5, 1)],
       [4, (6, 9.1), (1.6, 2.5)]]
)

result = {row[0]: prod(y - x for x, y in row[1:]) for row in data}

print(result)

随着 Python 的发展,总会有一种“更 Pythonic” 的方法。