使用 numpy 和 cupy 的数组类型的区别
Difference in the array type using numpy and cupy
我正在为我的模型使用 chainer 库并面临以下问题:
假设我有一个包含 3 个特征的测试数据文件和一个带有它们的标签(最后一列)。它以列表的形式导入。
例如
test_set = [[1,0,9,1],[7,0,8,1],[7,0,2,0],[8,0,1,0]]
然后我通过将数据转换为 numpy 数组并获取标签列来获取标签,
后来我将其转换为一个列表,以便与预测标签进行比较,比如 y_pred = [1,1,1,0]。即
import numpy as np
y_true_np = list(np.array(test_set)[:,3])
print(y_true_np)
[1, 1, 0, 0]
我担心的是,当我在 GPU 中 运行 我的模型时,它使用 Cuda.cupy 而不是 numpy,因为我使用的是链接器库,当我获取真实标签时,我收到的标签是:
在 cupy 中:
import cupy as cp
y_true_cp = list(cp.array(test_set)[:,3]) Or
y_true_cp = list(cuda.cp.array(test_set)[:,3])
既returns数组列表:
y_true_cp: [array(1), array(1), array(0), array(0)]
作为解决方法,我在那个特定的地方使用了 numpy。我是不是在使用 cupy 时做错了什么,导致我没有正确获取值?
正如您所写,当您用 list
换行时,行为似乎有所不同
import numpy as np
import cupy as cp
print(list(np.arange(3)) # --> [0, 1, 2]
print(list(cp.arange(3)) # --> [array(0), array(1), array(2)]
但是在你的情况下,我认为你可以只使用 numpy
数组或 cupy
数组而不转换 list
.
y_true = test_set[:, 3] # it should work for both numpy & cupy
y_true_np = cuda.to_cpu(y_true) # If you want to convert the array to numpy
虽然 NumPy 将 0 维数组转换为标量,但 CuPy 不会。
https://docs-cupy.chainer.org/en/stable/reference/difference.html#zero-dimensional-array
在结果[array(1), array(1), array(0), array(0)]
中,数组的每个数据都在GPU上。如果需要高效的 CPU 数组,我会使用 cupy.asnumpy
。
y_true_cp = list(cp.asnumpy(cp.array(test_set)[:,3]))
没有必要通过numpy。
输入
import cupy as cp
test_set = [[1,0,9,1],[7,0,8,1],[7,0,2,0],[8,0,1,0]]
test_set = cp.array(test_set)
x_true = test_set[:, :3]
y_true = test_set[:, 3]
print("x_true:\n".format(x_true))
print("y_true:\n".format(y_true))
输出
x_true:
[[1 0 9]
[7 0 8]
[7 0 2]
[8 0 1]]
y_true:
[1 1 0 0]
我正在为我的模型使用 chainer 库并面临以下问题: 假设我有一个包含 3 个特征的测试数据文件和一个带有它们的标签(最后一列)。它以列表的形式导入。 例如
test_set = [[1,0,9,1],[7,0,8,1],[7,0,2,0],[8,0,1,0]]
然后我通过将数据转换为 numpy 数组并获取标签列来获取标签, 后来我将其转换为一个列表,以便与预测标签进行比较,比如 y_pred = [1,1,1,0]。即
import numpy as np
y_true_np = list(np.array(test_set)[:,3])
print(y_true_np)
[1, 1, 0, 0]
我担心的是,当我在 GPU 中 运行 我的模型时,它使用 Cuda.cupy 而不是 numpy,因为我使用的是链接器库,当我获取真实标签时,我收到的标签是:
在 cupy 中:
import cupy as cp
y_true_cp = list(cp.array(test_set)[:,3]) Or
y_true_cp = list(cuda.cp.array(test_set)[:,3])
既returns数组列表:
y_true_cp: [array(1), array(1), array(0), array(0)]
作为解决方法,我在那个特定的地方使用了 numpy。我是不是在使用 cupy 时做错了什么,导致我没有正确获取值?
正如您所写,当您用 list
换行时,行为似乎有所不同
import numpy as np
import cupy as cp
print(list(np.arange(3)) # --> [0, 1, 2]
print(list(cp.arange(3)) # --> [array(0), array(1), array(2)]
但是在你的情况下,我认为你可以只使用 numpy
数组或 cupy
数组而不转换 list
.
y_true = test_set[:, 3] # it should work for both numpy & cupy
y_true_np = cuda.to_cpu(y_true) # If you want to convert the array to numpy
虽然 NumPy 将 0 维数组转换为标量,但 CuPy 不会。 https://docs-cupy.chainer.org/en/stable/reference/difference.html#zero-dimensional-array
在结果[array(1), array(1), array(0), array(0)]
中,数组的每个数据都在GPU上。如果需要高效的 CPU 数组,我会使用 cupy.asnumpy
。
y_true_cp = list(cp.asnumpy(cp.array(test_set)[:,3]))
没有必要通过numpy。
输入
import cupy as cp
test_set = [[1,0,9,1],[7,0,8,1],[7,0,2,0],[8,0,1,0]]
test_set = cp.array(test_set)
x_true = test_set[:, :3]
y_true = test_set[:, 3]
print("x_true:\n".format(x_true))
print("y_true:\n".format(y_true))
输出
x_true:
[[1 0 9]
[7 0 8]
[7 0 2]
[8 0 1]]
y_true:
[1 1 0 0]