高效的python方法,将np.array结构中表示的每行的元素(元组)相乘

高效的python方法,将np.array结构中表示的每行的元素(元组)相乘,python,tuples,numpy-ndarray,Python,Tuples,Numpy Ndarray,数据如下所示。这里的数据有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

数据如下所示。这里的数据有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)]]
丢弃第一列,我想将每行的其余元素相乘。在这里,列中的值(第一列除外)表示为元组。所以要乘法,我必须先解压元组,然后进行减法(需要对所有列执行此操作),然后进行乘法。例如,如果我考虑第一行,我应该得到下面的答案< /P>
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.24999998,3:4.3,4:2.789999996}
如果您需要这样的数据格式,那么构建一个字典很难超越这样的理解能力

使用纯
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以来,有一个标准函数用于iterable的所有元素的乘法,因此在本例中,您可以使用该函数代替
。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的发展,总会有一种“更具Python风格”的方法。

这似乎是一种更具Python风格的简单解决方案:

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.24999998,3:4.3,4:2.789999996}
如果您需要这样的数据格式,那么构建一个字典很难超越这样的理解能力

使用纯
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以来,有一个标准函数用于iterable的所有元素的乘法,因此在本例中,您可以使用该函数代替
。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”的方法。

输出是我想要的格式。我可能有一个60-80左右的列大小。如何将其合并到代码中我已经用一个更通用的示例更新了代码,它应该也适用于许多列。输出的格式是我想要的。我可能有一个60-80左右的列大小。如何将其合并到代码中我已经用一个更通用的示例更新了代码,该示例应该也适用于许多列。仅用于内部管理:您已经更新了您的问题以使用
np.array
类型,但问题标题仍然提到
ndarray
,也许你也可以将其更新为
np.array
。只是为了内部管理:你已经将问题更新为使用
np.array
类型,但问题标题仍然提到
ndarray
,也许你也可以将其更新为
np.array