【问题标题】:Matrix with results of function f(x,y) in Python/numpy/pandasPython/numpy/pandas 中函数 f(x,y) 结果的矩阵
【发布时间】: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


【解决方案1】:

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

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

因为 power 和 sum 是按元素操作的,所以表达式是可以的。乘法也是如此:

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

然后使用数组广播:

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 数组一起使用通常不是一个好主意,除非您知道自己在做什么。

【讨论】:

  • 你的意思是newaxis
  • 是的,newaxis。固定。
【解决方案2】:
itertools.starmap(operator.mul, itertools.product(X,Y))

为您提供一个带有值的生成器,您可以根据需要对其进行整形和打印。将 operator.mul 替换为您需要应用的相关函数。

【讨论】:

    【解决方案3】:

    免责声明:这个答案是建立在 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]]
    % 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多