【问题标题】:Sum up all values from all numpy subarray of different shape inside an array总结数组内所有不同形状的numpy子数组的所有值
【发布时间】:2015-01-03 13:28:14
【问题描述】:

我有一个 numpy.array 不同形状的 numpy 数组。 当我调用 np.sum(my_array) 我得到这个错误:

Traceback (most recent call last):
return umr_sum(a, axis, dtype, out, keepdims)
ValueError: operands could not be broadcast together with shapes (13,5) (5,3)

我想要的是所有数组中所有值的总和,例如 sum(my_array) = some float number

是否有一些我错过的参数或其他方法? 我只能想到这样的事情

np.sum([np.sum(a) for a in my_array])

这是最佳方式吗?

更新:

print(type(my_array))
print((my_array).shape)
print([(type(sub_array), sub_array.shape) for sub_array in my_array])

输出:

<class 'numpy.ndarray'>
(2,)
[(<class 'numpy.ndarray'>, (13, 5)), (<class 'numpy.ndarray'>, (5, 3))]

【问题讨论】:

  • 什么是my_array?它是一个包含 numpy 数组的 python 列表吗?
  • @jozzas 也是一个numpy.array
  • 这是什么类型的 ndarray,它包含其他不同形状的 ndarray?请为我们打印type(my_array)的结果。
  • @ballsdotballs 我已经用输出更新了上面的帖子。
  • TIL 你可以拥有 dtype 'object' 的 ndarray,其元素可以是任意形状和类型。

标签: python arrays python-3.x numpy


【解决方案1】:

在大多数情况下使用生成器应该会更好:

np.sum(np.sum(a) for a in my_array)

没有 '[ ... ]' 您不会创建列表。

%timeit np.sum( np.sum(a) for a in my_array )

100000 次循环,3 次中的最佳:每个循环 5.73 µs

%timeit np.sum( [np.sum(a) for a in my_array] )

100000 次循环,3 次中的最佳:每个循环 9.97 µs

【讨论】:

  • 哇。不知道我可以省略 '[..]' 谢谢。你是怎么做这个 %timeit 的?我试过了,但不能让它像你的那样工作。请问,你能告诉或发布一个链接吗?
  • 我在 IPython Notebook 上写了这个。你应该看一下,它包含在使用 anaconda 或 enthougt 安装 python 时。 %timeit 可以在那里使用。
【解决方案2】:
a = np.array(map(np.arange, range(16, 32)))

Eyy![28]: %timeit np.sum(map(np.sum, a))
10000 loops, best of 3: 90.5 µs per loop

Eyy![29]: %timeit np.sum(np.sum(b) for b in a)
10000 loops, best of 3: 86 µs per loop

Eyy![30]: %timeit np.sum([np.sum(b) for b in a])
10000 loops, best of 3: 90.2 µs per loop

还请注意,如果您事先知道最大大小,则很多时候只使用零填充的 numpy 数组会更容易。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多