代码之家  ›  专栏  ›  技术社区  ›  Luca

串联数组的numpy问题

  •  0
  • Luca  · 技术社区  · 7 年前

    cross([pt1,1]-[pp,0],[pt2,1]-[pp,0]);
    

    pt1 , pt2 pp 是二维点。

    因此,我对应的python代码如下所示:

    np.cross(np.c_[pt1 - pp, 1], np.c_[pt2 - pp, 1])
    

    pt1  = np.asarray((440.0, 59.0))
    pt2 = np.asarray((-2546.23, 591.03))
    pp = np.asarray([563.,  456.5])
    

    使用叉积执行语句时,出现以下错误:

    ValueError: all the input array dimensions except for the concatenation axis must match exactly
    

    看看其他的帖子,我想我会试试 np.column_stack 但我得到了同样的错误:

    np.cross(np.column_stack((pt1 - pp, 1)), np.column_stack((pt2 - pp, 1)))
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Indominus    7 年前

    这可能就是您正在寻找的:

    np.cross(np.append(pt1-pp, 1), np.append(pt2-pp, 1))
    
        2
  •  1
  •   hpaulj    7 年前

    如果你使用 np.r_ 相反,它是有效的:

    In [40]: np.cross(np.r_[pt1 - pp, 1], np.r_[pt2 - pp, 1])
    Out[40]: array([-5.32030000e+02, -2.98623000e+03, -1.25246611e+06])
    

    你的 pt1 pp 是(2,)数组。添加 1 对于它们,需要使用1d连接, np.r_ 用于“行”,而不是 columns .

    In [43]: np.r_[pt1 - pp, 1]
    Out[43]: array([-123. , -397.5,    1. ])
    In [44]: np.append(pt1 - pp, 1)
    Out[44]: array([-123. , -397.5,    1. ])
    In [45]: np.concatenate((pt1 - pp, [1]))
    Out[45]: array([-123. , -397.5,    1. ])
    

    concatenate 是基地行动。其他人调整了价格 生成可与(2,)形状数组连接的一维数组以生成(3,)。

    Concatenate将其所有输入转换为数组(如果尚未转换): np.concatenate((pt1 - pp, np.array([1]))) .

    注意 np.c_ 医生说这相当于

    np.r_['-1,2,0', index expression]
    

    初始字符串表达式有点复杂。关键是它尝试连接2d数组(而您的 是1d)。

    就像 column_stack, joining (2,1) arrays to make a (2,n)`数组。

    In [48]: np.c_[pt1, pt2]
    Out[48]: 
    array([[  440.  , -2546.23],
           [   59.  ,   591.03]])
    In [50]: np.column_stack((pt1, pt2))
    Out[50]: 
    array([[  440.  , -2546.23],
           [   59.  ,   591.03]])
    

    numpy c 努比 代码可以具有真正的标量(没有形状或大小的Python数字),也可以具有0或更多维度的数组。“向量”最自然地具有形状 (n,)

    如果想要(3,1)数组(而不是(3,)形状),则需要使用某种“垂直”连接,将(2,1)数组与(1,1)数组连接起来:

    In [51]: np.r_['0,2,0', pt1-pp, 1]
    Out[51]: 
    array([[-123. ],
           [-397.5],
           [   1. ]])
    In [53]: np.vstack([(pt1-pp)[:,None], 1])
    Out[53]: 
    array([[-123. ],
           [-397.5],
           [   1. ]])
    

    (但是 np.cross 需要(n,3)或(3,)数组,而不是(3,1)!)

    In [58]: np.cross(np.r_['0,2,0', pt1-pp, 1], np.r_['0,2,0', pt2-pp, 1])
    ...
    ValueError: incompatible dimensions for cross product
    (dimension must be 2 or 3)
    

    In [59]: np.cross(np.r_['0,2,0', pt1-pp, 1], np.r_['0,2,0', pt2-pp, 1], axis=0)
    Out[59]: 
    array([[-5.32030000e+02],
           [-2.98623000e+03],
           [-1.25246611e+06]])
    

    np.cross 如果需要操作尺寸标注的示例。在这个 axis=0 case将数组转置为(1,3),然后进行计算。