1

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

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吗?有人还可以告诉我如何重新编写函数以便将其矢量化吗?

谢谢你。

4

2 回答 2

4

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

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.
于 2013-11-07T08:24:21.003 回答
3

你可以使用vectorize装饰器

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

http://telliott99.blogspot.ch/2010/03/vectorize-in-numpy.html

于 2013-11-07T08:04:44.373 回答