我想通过在给定上采样因子’k’的元素之间添加’k-1’零来对给定的一维数组进行上采样。
k=2
A = np.array([1,2,3,4,5])
B = np.insert(A,np.arange(1,len(A)), values=np.zeros(k-1))
上面的代码适用于 k=2。
Output: [1 0 2 0 3 0 4 0 5]
k=3`
`A = np.array([1,2,3,4,5])`
`B = np.insert(A,np.arange(1,len(A)), values=np.zeros(k-1))
对于 k=3,它给我一个错误。
我想要的输出是 k-1,即元素之间有 3-1 = 2 个零。
Output: [1,0,0,2,0,0,3,0,0,4,0,0,5]
我想在一维数组的元素之间添加 k-1 个零。
ValueError Traceback (most recent call last)
Cell In [98], line 4
1 k = 3
3 A = np.array([1,2,3,4,5])
----> 4 B = np.insert(A, np.arange(1,len(A)), values=np.zeros(k-1))
6 print(k,'\n')
7 print(A,'\n')
File <__array_function__ internals>:180, in insert(*args, **kwargs)
File c:\Users\Nihar\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\lib\function_base.py:5325, in insert(arr, obj, values, axis)
5323 slobj[axis] = indices
5324 slobj2[axis] = old_mask
-> 5325 new[tuple(slobj)] = values
5326 new[tuple(slobj2)] = arr
5328 if wrap:
ValueError: shape mismatch: value array of shape (2,) could not be broadcast to indexing result of shape (4,)```
这会是你要找的吗?
k=3
A=np.array([1,2,3,4,5])
B=np.insert(A, list(range(1,len(A)+1))*(k-1), 0)
我只是复制 obj 数组中的索引。另外,不需要构建一个零数组,一个 0 标量将用于 value 参数。
请注意,肯定有比list
创建该索引更好的方法(因为它实际上构建了一个列表)。我暂时想不出单线。但是,如果该列表很大,那么为此创建一个迭代器可能是个好主意。
我不确定(我以前从未问过自己这个问题)这个插入是否是最佳的。例如
B=np.zeros((len(A)*k,), dtype=np.int)
B[::k]=A
也可以解决问题。哪一个在内存方面更好(我会说这个,但乍一看,因为它不会创建 obj 列表),而在 cpu 方面,不确定。
编辑:事实上,我刚刚尝试过。第二种解决方案要快得多(27 ms vs 1586 ms,对于具有 50000 个值和 k=100 的 A)。这并不奇怪。很容易弄清楚它的作用(在 C 中,我的意思是在 numpy 代码中,而不是在 python 中):只是一个分配,然后是一个 for 循环来复制一些值。简直不能再简单了。而 insert 可能会计算移位等