NotImplementedError:分配中的无效类型

Posted

技术标签:

【中文标题】NotImplementedError:分配中的无效类型【英文标题】:NotImplementedError: invalid type in assignment 【发布时间】:2018-05-06 10:20:33 【问题描述】:

我有一个 csv 数据,数据的第一列是“标签”,第一列到最后 784 列之后的列包含图像 (28*28) 格式的表示。我创建了一个 numpy 数组的元组使用加载(文件名)函数。此函数为图像分配标签。

现在我想使用下面函数 read(digits, path = ".") 中生成的数据。此格式用于 scikit 库的支持向量机分析。实际上,我正在尝试模仿(底部的第二个示例):http://cvxopt.org/applications/svm/index.html

当我尝试重新格式化数据时,我收到一个复制到正文下方的错误。有没有办法,我可以得到所需的格式?

train_name=dir_path+'train8.csv'
def load(filename):
    # read file into a list of rows
    with open(filename, 'rU') as csvfile:
        lines = csv.reader(csvfile, delimiter=',')
        rows = list(lines)

    # create empty numpy arrays of the required size
    data = np.empty((len(rows), len(rows[0])-1), dtype=np.float64)
    expected = np.empty((len(rows),), dtype=np.int64)

    # fill array with data from the csv-rows
    for i, row in enumerate(rows):
        data[i,:] = row[1:]
        expected[i] = row[0]

    result_data = data, expected
    return result_data

> Result:

    (array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
               [ 0.,  0.,  0., ...,  0.,  0.,  0.],
               [ 0.,  0.,  0., ...,  0.,  0.,  0.],
               ..., 
               [ 0.,  0.,  0., ...,  0.,  0.,  0.],
               [ 0.,  0.,  0., ...,  0.,  0.,  0.],
               [ 0.,  0.,  0., ...,  0.,  0.,  0.]]), array([1, 1, 1, ..., 1, 1, 1]))


def read(digits, path = "."):
    data= load(train_name)
    print "sizeImages = ",len(data[0]), "sizelabels = ", len(data[1])

    lbl=data[1]
    size=len(data[1])
    img=data[0] #print type(img) OUTPUT: <type 'numpy.ndarray'>

    img =[l[0] for l in img] # print type(img) OUTPUT: <type 'list'>, 
    *This is used to unpack the numpy array from above.* 

    ind = [ k for k in xrange(size) if lbl[k] in digits ]

    images =  matrix(0, (len(ind), 28*28))
    labels = matrix(0, (len(ind), 1))

    #images =  data[0]
    labels = img

    for i in xrange(len(ind)):
        images[i, :] = img[ ind[i]*28*28: (ind[i]+1)*28*28]
        labels[i] = lbl[ind[i]]
    return images,labels
print read([8],  path = dir_path)

结果:

sizeImages =  5851 sizelabels =  5851
Traceback (most recent call last):
  File "svm.py", line 62, in <module>
    print read([8],  path = dir_path)
  File "svm.py", line 59, in read
    images[i, :] = img[ ind[i]*28*28: (ind[i]+1)*28*28]
NotImplementedError: invalid type in assignment

所需格式:

**(<5949x784 matrix, tc='i'>, <5949x1 matrix, tc='i'>)**

即上面第一个矩阵为:array-like, sparse matrix,shape = [n_samples, n_features]训练向量,其中n_samples为样本个数,n_features为特征个数。

sample data: 
'''1    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   38  254 109 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   87  252 82  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   135 241 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   45  244 150 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   84  254 63  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   202 223 11  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   32  254 216 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   95  254 195 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   140 254 77  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   57  237 205 8   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   124 255 165 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   171 254 81  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   24  232 215 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   120 254 159 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   151 254 142 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   228 254 66  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   61  251 254 66  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   141 254 205 3   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   10  215 254 121 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   5   198 176 10  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0'''

【问题讨论】:

欢迎来到 ***。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。 插入几个print type(&lt;item&gt;) 语句来检查数据类型。将它们放在失败的分配之前。 嗨 Prune,我确实尝试过使用 print 进行调试。我得到 numpy.ndarray 的任何回报。感谢 MCVE。我发布了这两个函数以确保读者理解上下文。 更好,但代码仍然不能自行运行。将您的调试信息添加到问题正文中,而不是在评论中 - 它可以帮助人们专注于问题。 添加了一些注释和调试步骤。 【参考方案1】:

一种可能的解决方案是:

from sklearn.datasets.base import Bunch

file=np.loadtxt('~/data/test3.txt', dtype=int)
target_index=0

dataset = file
data    = None
target  = None
target_names  = None
feature_names = None

# Target assumed to be either last or first row
if target_index == -1:
    data   = dataset[:, 0:-1]
    target = dataset[:, -1]
elif target_index == 0:
    data   = dataset[:, 1:]
    target = dataset[:, 0]
else:
    raise ValueError("Target index must be either -1 or 0")

reformatData=Bunch(data=data, target=target)

print reformatData['data'].shape, reformatData['target'].shape

【讨论】:

以上是关于NotImplementedError:分配中的无效类型的主要内容,如果未能解决你的问题,请参考以下文章

预分配的节点向量中的无锁树节点分配

有没有不分配 k 的无监督学习算法

了解 Azure 中的无服务器计算

如何解决 Pythone3.6 中的 raise NotImplementedError

关于PyTorch继承nn.Module出现raise NotImplementedError的问题解决方案

关于PyTorch继承nn.Module出现raise NotImplementedError的问题解决方案