使用 Cupy 将数组附加到矩阵

Posted

技术标签:

【中文标题】使用 Cupy 将数组附加到矩阵【英文标题】:Appending arrays to matrix using Cupy 【发布时间】:2020-09-02 19:08:21 【问题描述】:

我正在使用 cupy 创建一个矩阵和一个数组。我只是想删除矩阵的第一行,然后将新数组水平附加到矩阵中。我计划将其放入一个循环中,在该循环中我将不断删除矩阵中的第一行并将新数组附加到底部。但我不断收到错误消息:ValueError: All arrays to concatenate must have the same ndim。矩阵的形状是(10, 100),数组是(100,)。

import cupy as cp

hori_avg = [0]*100
buffer_size = 10
width = 100 
a = cp.zeros((buffer_size, width))

new_frame = cp.ones(100)*3

a = a[1:, :]                        #delete first row
a = cp.stack((a,new_frame), axis=0) #append new row, but not working

我遇到了与 concatenate 相同的问题,而 cupy 似乎不存在 append。

【问题讨论】:

【参考方案1】:

new_frame 数组的尺寸应该与数组a 的尺寸完全相同,以便在cp.stack 函数中使用。在这种情况下,您需要在将new_frame 的尺寸更改为(1,100)后使用cp.concatenate。更正后的脚本如下:

import cupy as cp

hori_avg = [0]*100
buffer_size = 10
width = 100 
a = cp.zeros((buffer_size, width))

new_frame = cp.ones((1,100))*3

a = a[1:, :]                        #delete first row
a = cp.concatenate((a,new_frame), axis=0)

如cupy.concatenate 文档中所述,

"tup(数组序列)- 要连接的数组。 所有这些都应该具有相同的维度,除了 指定轴”

这就是为什么我用 new_frame = cp.ones((1,100))*3 修改了线 new_frame 数组的形状,以使未指定的轴 (axis=1) 具有相同的维度(即 100)

关于这一点的更多信息:

不幸的是,cupy 文档尚未完善(截至 2020 年 11 月),但在大多数情况下,我们可以查看相应的 Numpy 文档。

numpy stack function 与concatenate function 不同,它强制在所有轴上堆叠的数组之间的维度相等。 cupy.stacknumpy.stack 在内部调用它们对应的 concatenate 函数来加入数组。

【讨论】:

以上是关于使用 Cupy 将数组附加到矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 cupy 从 GPU 上的另一个矩阵创建距离矩阵

Cupy与Numpy的数据类型互转

Cupy的用处概述

如何将 CuPy 数组传输到 tensorflow

Cupy矩阵乘法n次

如何正确使用 CuPy 流