高效的python方法,将np.array结构中表示的每行的元素(元组)相乘
数据如下所示。这里的数据有3列(作为示例),但通常情况下,数据会有更多的列高效的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
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
。