【发布时间】:2017-05-30 01:55:28
【问题描述】:
我可能在这里看不到明显的东西,但不要相信 np.apply_along_axis 或 np.apply_over_axes 是我正在寻找的东西。假设我有以下两个数组:
arr1 = np.random.randn(10, 5)
arr2 = np.random.randn(10, )
还有以下功能:
def coefs(x, y):
return np.dot(np.linalg.inv(np.dot(x.T, x)), np.dot(x.T, y))
# the vector of coefficients in a multiple linear regression
在arr1 和arr2 上调用它可以正常工作:
coefs(arr1, arr2)
Out[111]: array([-0.19474836, -0.50797551, 0.82903805, 0.06332607, -0.26985597])
但是,假设我有两个 3d 数组,而不是 1 维或 2 维数组:
arr3 = np.array([arr1[:-1], arr1[1:]])
arr4 = np.array([arr2[:-1], arr2[1:]])
正如预期的那样,如果我在这里应用该功能,我会得到
coefs(arr3, arr4)
Traceback (most recent call last):
File "<ipython-input-127-4a3e7df02cda>", line 1, in <module>
coefs(arr3, arr4)
File "<ipython-input-124-7532b8516784>", line 2, in coefs
return np.dot(np.linalg.inv(np.dot(x.T, x)), np.dot(x.T, y))
ValueError: shapes (5,9,2) and (2,9,5) not aligned: 2 (dim 2) != 9 (dim 1)
...因为 NumPy 将每个数组视为应有的对象。我想要做的是将coefs() 函数应用于沿数组0 轴的2 个元素中的每一个元素,逐个元素。这是一种粗略的做法:
tgt = []
for i, j in zip(arr3, arr4):
tgt.append(coefs(i, j))
np.array(tgt)
Out[136]:
array([[-0.34328006, -0.99116672, 1.42757897, -0.06687851, -0.44669182],
[ 0.44494495, -0.58017705, 0.75825944, 0.18795889, 0.4560851 ]])
我的问题是,有没有比使用 zip 和迭代更有效和 Pythonic 的方法,如上所述? 基本上,给定两个形状为 (2, n, k) 的输入数组和 (2, n),我希望返回的数组具有 (2, k) 的形状。谢谢。
【问题讨论】:
-
为什么你认为
arr2的形状是 10x5? -
3D数组的第一个轴长度是否会像arr3和2D数组arr4一样始终为2? -
@user2357112 你说得对,是我的错字。
-
@Divakar 简短的回答是否定的,我想概括一下,以便生成的数组的第一个轴长度保持 arr3 和 arr4 的第一个轴长度。
-
@BradSolomon Kool。查看已发布的实现相同的解决方案?
标签: python python-3.x numpy