乘以 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” 的方法。
数据表示如下。这里的数据有 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” 的方法。