【问题标题】:Vectorized NumPy linspace across multi-dimensional arrays跨多维数组的向量化 NumPy linspace
【发布时间】:2018-03-23 11:31:00
【问题描述】:

假设我有 2 个 numpy 2D 数组、最小值和最大值,它们的维度总是相同的。我想创建第三个数组 results,这是将 linspace 应用于最大值和最小值的结果。有没有一些“numpy”/矢量化的方式来做到这一点?下面是示例非矢量化代码以显示我想要的结果。

import numpy as np

mins = np.random.rand(2,2)
maxs = np.random.rand(2,2)

# Number of elements in the linspace
x = 3

m, n = mins.shape
results = np.zeros((m, n, x))

for i in range(m):
    for j in range(n):
        min = mins[i][j]
        max = maxs[i][j]
        results[i][j] = np.linspace(min, max, num=x)

【问题讨论】:

  • 如何缩放来自np.linspace(0,1,num=x) 的结果?
  • 在这种情况下如何获得最小值和最大值?
  • mins[...,None] + (maxs-mins)[...,None]*np.linspace(0,1,num=x)。这使用广播通过mins 和maxs 扩展linspace。

标签: python numpy vectorization


【解决方案1】:

这是一种基于 this post 的矢量化方法,用于涵盖通用 n-dim 案例 -

def create_ranges_nd(start, stop, N, endpoint=True):
    if endpoint==1:
        divisor = N-1
    else:
        divisor = N
    steps = (1.0/divisor) * (stop - start)
    return start[...,None] + steps[...,None]*np.arange(N)

示例运行 -

In [536]: mins = np.array([[3,5],[2,4]])

In [537]: maxs = np.array([[13,16],[11,12]])

In [538]: create_ranges_nd(mins, maxs, 6)
Out[538]: 
array([[[  3. ,   5. ,   7. ,   9. ,  11. ,  13. ],
        [  5. ,   7.2,   9.4,  11.6,  13.8,  16. ]],

       [[  2. ,   3.8,   5.6,   7.4,   9.2,  11. ],
        [  4. ,   5.6,   7.2,   8.8,  10.4,  12. ]]])

【讨论】:

  • if endpoint==1:?这是bool ,所以只需要if endpoint:。
【解决方案2】:

截至 Numpy 版本 1.16.0,non-scalar start and stop are now supported。

所以,现在你可以这样做了:

assert np.__version__ > '1.17.2'

mins = np.random.rand(2,2)
maxs = np.random.rand(2,2)

# Number of elements in the linspace
x = 3

results = np.linspace(mins, maxs, num=x)

# And, if required
results = np.rollaxis(results, 0, 3)

【讨论】:

    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2021-03-20
    • 2015-11-19
    • 2018-07-15
    相关资源
    最近更新 更多