【发布时间】:2014-12-18 09:30:17
【问题描述】:
我在 Python 中有两个系列 X 和 Y 一个函数 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 功能非常方便。
我需要道歉,因为我觉得这个问题已经得到了回答。我的问题是我不知道这个操作叫什么以及我应该寻找什么。我发现的是矩阵和向量乘法的不同示例,但我不想用这两个系列计算标量。
非常感谢!
我尝试按照建议使用数组广播,但我仍然遇到问题:
i = np.array(['(-39.736165,-73.238696)', '(-39.765165,-71.230696)', '(-40.736165,-73.230696)'])
j = np.array(['(-38.736165,-73.230696)', '(-35.736165,-73.230696)', '(-41.736165,-73.230696)'])
i = i[:, np.newaxis]
i.shape
(3,1)
PP = vincenty(i, j).meters
>> TypeError: don't know how to convert scalar number to float
还有一个问题:即使我只想将 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、数组广播),我会在其他应用程序中记住它们。非常感谢!
【问题讨论】:
-
非常感谢您的帮助。我非常喜欢数组广播可以做的事情,但是,还有一件事……我实际上没有公式的两个输入,而是四个(每个位置的 X 和 Y 坐标)。我的想法是有一个包含二维条目的数组,但是,我不确定如何处理公式中的第一个和第二个条目( f(x1,y1,x2,y2) )。
标签: python numpy matrix pandas