python - 在 Numpy Python 中向量化此函数

标签 python arrays numpy vectorization

我有一个包含 60,000 个数字的数组,从 0 到 9:

In [1]: trainY
Out[1]: 
array([[5],
       [0],
       [4],
       ..., 
       [5],
       [6],
       [8]], dtype=int8)

我有一个函数可以将 trainY 中的每个元素转换为 10 元素向量,如下所示:

0 -> [1,0,0,0,0,0,0,0,0,0]
1 -> [0,1,0,0,0,0,0,0,0,0]
2 -> [0,0,1,0,0,0,0,0,0,0]
3 -> [0,0,0,1,0,0,0,0,0,0]
...
9 -> [0,0,0,0,0,0,0,0,0,1]

函数:

def transform_y(y):
    new_y = np.zeros(10)
    new_y[y] = 1
    return new_y

我的代码一次只能处理 1 个元素。一次性转换我的 trainY 数组的最佳方法是什么(for 循环除外)?我应该使用 map 吗?有人还可以告诉我如何重写函数以使其矢量化吗?

谢谢。

最佳答案

您可以大大提高代码速度,创建一个沿对角线排列的二维数组,然后根据输入数组提取正确的行:

a = array([[5],
           [0],
           [4],
           ..., 
           [5],
           [6],
           [8]], dtype=int8)

new_y = np.eye(a.max()+1)[a.ravel()]

一个更快的解决方案是用零创建输出数组,然后根据 a 中的索引填充它:

new_y = np.zeros((a.shape[0], a.max()+1))
new_y[np.indices(a.ravel().shape)[0], a.ravel()] = 1.

关于python - 在 Numpy Python 中向量化此函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830594/

相关文章:

python - 尝试访问最后一个索引时出现索引超出范围错误

javascript - 如何将 javascript cdata 字符串重新格式化为数组?

javascript - 如何向数组中的键添加/删除值(不只是谈论推送/删除运算符)

python - 从字典形式中随机选择数据

python - Python使用套接字通过LAN连接

python - 如何使用 django for 标签在 10 种不同的背景颜色之间旋转

python - 了解 PyTorch 中 index_put 的行为

arrays - 将 NxNxM 数组 reshape 为 MxNxN

python - Pandas DataFrame 替换不适用于 inplace=True

python - 在 numpy 矩阵上调用 Google Cloud Vision API