web-dev-qa-db-ja.com

エラーの取得:サイズ122304の配列を形状(52,28,28)に再形成できません

私はnumpy配列を次のように変形しようとしています:

data3 = data3.reshape((data3.shape[0], 28, 28))

ここで、data3は:

[[54 68 66 ..., 83 72 58]
 [63 63 63 ..., 51 51 51]
 [41 45 80 ..., 44 46 81]
 ..., 
 [58 60 61 ..., 75 75 81]
 [56 58 59 ..., 72 75 80]
 [ 4  4  4 ...,  8  8  8]]

data3.shape(52, 2352 )です

しかし、次のエラーが発生し続けます。

ValueError: cannot reshape array of size 122304 into shape (52,28,28)
Exception TypeError: TypeError("'NoneType' object is not callable",) in <function _remove at 0x10b6477d0> ignored

何が起こっており、このエラーを修正するにはどうすればよいですか?

更新:

上記で使用されているdata3を取得するためにこれを行っています。

def image_to_feature_vector(image, size=(28, 28)):

    return cv2.resize(image, size).flatten()

data3 = np.array([image_to_feature_vector(cv2.imread(imagePath)) for imagePath in imagePaths])  

imagePathsには、データセット内のすべての画像へのパスが含まれています。実際にdata3をflat list of 784-dim vectorsに変換したいのですが、

image_to_feature_vector 

関数は3072次元のベクトルに変換します!!

7
akrama81

Numpy行列の配列は、before(a x b x c..n)= after(a x b x c..n)のように変形できます。つまり、マトリックスの合計要素は以前と同じである必要があります。この場合、変換されたdata3が形状(156、28、28)または単に:-になるように変換できます。

import numpy as np

data3 = np.arange(122304).reshape(52, 2352 )

data3 = data3.reshape((data3.shape[0]*3, 28, 28))

print(data3.shape)

出力は次の形式です

[[[     0      1      2 ...,     25     26     27]
  [    28     29     30 ...,     53     54     55]
  [    56     57     58 ...,     81     82     83]
  ..., 
  [   700    701    702 ...,    725    726    727]
  [   728    729    730 ...,    753    754    755]
  [   756    757    758 ...,    781    782    783]]
  ...,
[122248 122249 122250 ..., 122273 122274 122275]
  [122276 122277 122278 ..., 122301 122302 122303]]]
4
Kaushik Nayak

まず、入力画像の要素の数は、目的の特徴ベクトルの要素の数と一致する必要があります。

上記が満たされていると仮定すると、以下が機能するはずです:

# Reading all the images to a one numpy array. Paths of the images are in the imagePaths
data = np.array([np.array(cv2.imread(imagePaths[i])) for i in range(len(imagePaths))])

# This will contain the an array of feature vectors of the images
features = data.flatten().reshape(1, 784)
0
akilat90