如何最佳方法从行向量创建一个块矩阵?

2024-04-19 12:50:23 发布

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

我有下面的numpy行矩阵。你知道吗

X = np.array([1,2,3])

我想创建一个块矩阵,如下所示:

1 0 0
2 1 0
3 2 1
0 3 2
0 0 3

我怎么能用numpy做这个?你知道吗


Tags: numpynp矩阵array
3条回答

方法#1:使用^{}-

from numpy.lib.stride_tricks import as_strided as strided

def zeropad_arr_v1(X):
    n = len(X)
    z = np.zeros(len(X)-1,dtype=X.dtype)
    X_ext = np.concatenate(( z, X, z))

    s = X_ext.strides[0]
    return strided(X_ext[n-1:], (2*n-1,n), (s,-s), writeable=False)

注意,这将创建一个read-only输出。如果以后需要写入,只需在末尾附加.copy()就可以制作一个副本。你知道吗

方法#2:使用带零的串联,然后剪裁/切片-

def zeropad_arr_v2(X):
    n = len(X)
    X_ext = np.concatenate((X, np.zeros(n,dtype=X.dtype)))
    return np.tile(X_ext, n)[:-n].reshape(-1,n,order='F')

方法1是一种基于跨步的方法,在性能上应该非常有效。你知道吗

示例运行-

In [559]: X = np.array([1,2,3])

In [560]: zeropad_arr_v1(X)
Out[560]: 
array([[1, 0, 0],
       [2, 1, 0],
       [3, 2, 1],
       [0, 3, 2],
       [0, 0, 3]])

In [561]: zeropad_arr_v2(X)
Out[561]: 
array([[1, 0, 0],
       [2, 1, 0],
       [3, 2, 1],
       [0, 3, 2],
       [0, 0, 3]])

运行时测试

In [611]: X = np.random.randint(0,9,(1000))

# Approach #1 (read-only)
In [612]: %timeit zeropad_arr_v1(X)
100000 loops, best of 3: 8.74 µs per loop

# Approach #1 (writable)
In [613]: %timeit zeropad_arr_v1(X).copy()
1000 loops, best of 3: 1.05 ms per loop

# Approach #2
In [614]: %timeit zeropad_arr_v2(X)
1000 loops, best of 3: 705 µs per loop

# @user8153's solution
In [615]: %timeit hstack_app(X)
100 loops, best of 3: 2.26 ms per loop

其他可写解决方案:

def block(X):
   n=X.size
   zeros=np.zeros((2*n-1,n),X.dtype)
   zeros[::2]=X
   return zeros.reshape(n,-1).T

尝试:

In [2]: %timeit block(X)
600 µs ± 33 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

如果从上到下,再从左到右读取所需的输出矩阵,则会看到模式1、2、3、0、0、1、2、3、0、0、0、1、2、3。您可以使用该阵列轻松创建线性阵列,然后将其重塑为二维形式:

import numpy as np
X = np.array([1,2,3])
N = len(X)
zeros = np.zeros_like(X)
m = np.hstack((np.tile(np.hstack((X,zeros)),N-1),X)).reshape(N,-1).T
print m

给予

[[1 0 0]
 [2 1 0]
 [3 2 1]
 [0 3 2]
 [0 0 3]]

相关问题 更多 >