数组的numpy数组或2D数组乘以

2024-09-28 05:28:11 发布

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

我想得到一个结果 ax=as_x-aseg_3d*直线

其中asux和aline是numpy向量,aseg\u3d是一个数组。因为x.shape和aline\u a shape是(S,),而aseg\u 3d shape也显示为(S,),因为它应该用于数组。结果ax也是一个数组,其形状与aseg\ U 3d相同

问题是,aseg\u3d是一个数组,因为里面的数组长度不同。然而,有时他们不这样做,而比阿塞古三维成为只是一个二维阵列。然后,上述多应用程序在ValueError时失败:操作数无法与形状(S,N)一起广播。你知道吗

我可以这样做: ax=as_x[:,无]-aseg_3d*aline_a[:,无]

但是当我有一个数组时,这与前面的情况不一样。你知道吗

有没有办法让它在两种情况下都能工作:数组数组和二维数组?你知道吗

或者有一种方法可以保持数组的numpy数组dtype=“object”,即使所有内部数组的长度相同?你知道吗

顺便说一句,我试着用列表理解来做上面的乘法运算,这总是可行的,但是速度要慢得多。你知道吗

谢谢你的建议!你知道吗


Tags: numpy应用程序as情况数组ax向量直线
1条回答
网友
1楼 · 发布于 2024-09-28 05:28:11

在两种情况下都有效的表达式:

你可以利用转置。简单情况(仅乘法):

(vector * vec_of_vecs_or_2D.T).T

完整操作示例:

(vector1 - vector2 * vec_of_vecs_or_2D.T).T

示例:

>>> v = np.array([3, 5])
>>> A = np.array((*map(np.array,[[1,2],[1,2,3]]),))
>>> B = np.array([[1,2,4],[1,2,3]])
>>> 
>>> v
array([3, 5])
>>> A
array([array([1, 2]), array([1, 2, 3])], dtype=object)
>>> B
array([[1, 2, 4],
       [1, 2, 3]])
>>> 
>>> (v*B.T).T
array([[ 3,  6, 12],
       [ 5, 10, 15]])
>>> (v*A.T).T
array([array([3, 6]), array([ 5, 10, 15])], dtype=object)

工作原理:

如果vec_of_vecs_or_2D是对象数据类型的1D,那么转置什么也不做。你知道吗

如果vec_of_vecs_or_2D真的是2D,那么转置将匹配vector的轴移动到末尾,这样vector就被正确地广播了,然后又返回。你知道吗

为什么便宜:

请注意,numpy中的转置是惰性的。它实际上并不移动任何数据,它只是“交换轴标签”。你知道吗

例如,对1000x1000数组进行转置需要在我的笔记本电脑上花费约200 ns:

>>> a = np.arange(1_000_000).reshape(1000, 1000)
>>> timeit(lambda: a.T)
0.22008929261937737

或者,在任何情况下强制阵列:

示例

>>> L1 = [np.arange(i, 2*i+2) for i in range(3)]
>>> L2 = [np.arange(i, i+3) for i in range(3)]
>>> L1
[array([0, 1]), array([1, 2, 3]), array([2, 3, 4, 5])]
>>> L2
[array([0, 1, 2]), array([1, 2, 3]), array([2, 3, 4])]

方法1(丑陋但简单):

>>> A1 = np.array([*L1, None])[:-1]
>>> A2 = np.array([*L2, None])[:-1]
>>> A1
array([array([0, 1]), array([1, 2, 3]), array([2, 3, 4, 5])], dtype=object)
>>> A2
array([array([0, 1, 2]), array([1, 2, 3]), array([2, 3, 4])], dtype=object)

方法二:(不那么难看,但很复杂)

>>> A1 = np.frompyfunc(L1.__getitem__, 1, 1)(range(len(L1)))
>>> A2 = np.frompyfunc(L2.__getitem__, 1, 1)(range(len(L2)))
>>> A1
array([array([0, 1]), array([1, 2, 3]), array([2, 3, 4, 5])], dtype=object)
>>> A2
array([array([0, 1, 2]), array([1, 2, 3]), array([2, 3, 4])], dtype=object)

相关问题 更多 >

    热门问题