Python/numpy/pandas中函数f(x,y)结果的矩阵

2024-05-23 22:47:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个系列X和Y,在Python中有一个函数f(X,Y)。我想生成一个矩阵,其中包含X和Y的每个组合的函数的输出。例如,如果函数只是一个简单的乘法,它将如下所示:

     1   2   3   4   5
   -------------------
1 |  1   2   3   4   5            
2 |  2   4   6   8  10
3 |  3   6   9  12  15
4 |  4   8  12  16  20
5 |  5  10  15  20  25

X和Y实际上是坐标对,我想应用的函数是到geopy包的vincenty距离。在

X和Y是pandas数据帧的一系列,因为我从excel电子表格中读取数据,我发现pandas read_excel功能非常方便。在

我需要道歉,因为我觉得这个问题已经得到了回答。我的问题是我不知道这个手术叫什么,我应该找什么。我发现的是矩阵和向量乘法的不同例子,但我不想用两个级数来计算标量。在

非常感谢!在


我尝试按建议使用阵列广播,但仍有一个问题:

^{pr2}$

还有另一个问题:即使我只想将vincenty公式应用于数据帧中的序列,也会收到一条错误消息:

for i in data.index:
print(vincenty((data['X'], data['Y']), (data['Y'], data['Y'])).meters)
>> ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

问题是我不知道我是怎么得到这些错误的。我可以给出四个单独的值作为vincenty公式的坐标,或者一个列表或一个字符串,这样就可以了。但是我可以将公式应用到多个条目的唯一方法是使用列表。在


好吧,最后一次编辑。。。我不能完全按照你的建议去做。相反,我将pandas系列转换为列表,并使用公式循环查看列表。我想这是最低效的方法,但这是我能用我的编程技巧和性能来做的,对我来说并不重要。但是,我很感谢您的建议(itertools,array broadcasting),对于其他应用,我会记住它们。非常感谢你!在


Tags: 数据方法函数距离pandas列表data错误
3条回答
itertools.starmap(operator.mul, itertools.product(X,Y))

为您提供一个包含值的生成器,您可以根据需要对其进行整形和打印。替代品操作员.mul与你需要应用的相关功能。在

免责声明:这个答案是建立在pv.的基础上的,仅仅是对她/他的回答的一点评论。

注意,向数据添加新轴的方式意味着在结果矩阵中进行换位,您要做的最终取决于您喜欢如何读取结果,如在代数中(x是行,y是列),或者就像地图一样(x是经度,y是纬度)

% cat mu.py 
import numpy as np
def f(a,b): return a+10*b

x = np.arange(1,6)
y = np.arange(1,6)

print "inner newaxis"
print x[:,np.newaxis], '\n', y[np.newaxis,:]*10
print f(x[:,np.newaxis], y[np.newaxis,:])

print "outer newaxis"
print x[np.newaxis,:], '\n', y[:,np.newaxis]*10
print f(x[np.newaxis,:], y[:,np.newaxis])
% python mu.py 
inner newaxis
[[1]
 [2]
 [3]
 [4]
 [5]] 
[[10 20 30 40 50]]
[[11 21 31 41 51]
 [12 22 32 42 52]
 [13 23 33 43 53]
 [14 24 34 44 54]
 [15 25 35 45 55]]
outer newaxis
[[1 2 3 4 5]] 
[[10]
 [20]
 [30]
 [40]
 [50]]
[[11 12 13 14 15]
 [21 22 23 24 25]
 [31 32 33 34 35]
 [41 42 43 44 45]
 [51 52 53 54 55]]
% 

习惯用法是这样的:编写函数f(x,y),这样它就可以对Numpy数组进行元素操作。 例如,如果您想计算f(x,y) = x**2 + y**2,这是

def f(x, y):
    return x**2 + y**2

因为幂和和运算是按元素进行的,所以表达式是可以的。同样对于乘法:

^{pr2}$

然后使用阵列广播:

x, y = np.asarray(x), np.asarray(y)  # ensure x, y are Numpy arrays
print f(x[:,np.newaxis], y[np.newaxis,:])

https://scipy-lectures.github.io/intro/numpy/operations.html#broadcasting(向下滚动一点可查看示例)

将itertools用于numpy数组通常不是一个好主意,除非您知道自己在做什么。在

相关问题 更多 >