将列表转换为numpy数组。

106

我已经使用sklearn的命令行加载了文件夹中的图片:load_sample_images()

现在我想将它转换为以float32数据类型的numpy.ndarray格式。

我尝试使用np.array(X)将其转换为np.ndarray, 但是np.array(X, dtype=np.float32)np.asarray(X).astype('float32')会给我报错:

ValueError: setting an array element with a sequence.

有没有办法绕过这个问题?

from sklearn_theano.datasets import load_sample_images
import numpy as np  

kinect_images = load_sample_images()
X = kinect_images.images

X_new = np.array(X)  # works
X_new = np.array(X[1], dtype=np.float32)  # works

X_new = np.array(X, dtype=np.float32)  # does not work

5
你有一个列表嵌套的列表,其中不是所有的子列表都具有相同数量的条目。 - Daniel
成功执行 np.array(x) 后,请检查类型。如果它是默认的 float64 类型,则您只是尝试分配一个不适合您的列表(或列表的列表)的类型。 - ha9u63a7
np.array(x)的数据类型是uint8。我认为它是一个列表的列表。 - Priya Narayanan
似乎不太可能出现“np.array(X).dtype == np.uint8”,但“np.array(X, dtype=np.float32)”会失败。要检查要放入数组中的所有列表是否具有相同的长度,可以执行“np.unique([len(x) for x in X])”。 - Andreas Mueller
谢谢,这些图像的尺寸是不同的。 - Priya Narayanan
显示剩余4条评论
2个回答

146

如果您有一个列表的列表,您只需要使用嵌套的 for 循环来遍历它。

import numpy as np
...
npa = np.asarray(someListOfLists, dtype=np.float32)

根据scipy/numpy文档中的LINK,你只需要在调用asarray时定义dtype即可。


2

如果您要将列表转换为数组,则无论如何都需要制作一个新副本,因此

arr = np.array(my_list, dtype='float32')

也可以工作。

一个使用案例是当my_list实际上不是列表,而是其他类似列表的对象时;在这种情况下,事先显式地转换为列表可能会有所帮助。

arr = np.array(list(my_list), dtype='float32')

例如,
my_list = pd.Series([[1], [2], [3]]).values

np.array(my_list)             # jagged array; not OK
np.array(list(my_list))       # OK
np.array(my_list.tolist())    # OK


my_list = {'a': [1], 'b': [2]}.values()
np.array(my_list)             # jagged array; not OK
np.array(list(my_list))       # OK

将嵌套列表转换为数组时,子列表的形状必须匹配。如果它们不匹配,您可能想沿某个轴连接子列表。尝试使用np.concatenate/np.r_/np.c_等方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接