【问题标题】:How to set element of numpy array to be numpy array?如何将numpy数组的元素设置为numpy数组?
【发布时间】:2020-12-13 03:33:29
【问题描述】:

我想将self.weights 的特定元素(一个numpy 数组)设置为另一个numpy 数组,但出现这两个错误:

"TypeError: 只有 size-1 的数组可以转换为 Python 标量"

"ValueError: 设置一个带有序列的数组元素。".

例子:

self.weights=np.empty(some size)
self.weights[i]=np.random.randn(some size)

这是我的代码:

import numpy as np
import sys
    
np.set_printoptions(threshold=sys.maxsize)

class NeuralNetwork:
    def __init__(self, inputs, hiddensSizes, outputs, lr, epochs):
        self.inputs = inputs
        self.inputsSize = self.inputs.shape[1]
        self.outputs = outputs
        self.outputsSize = self.outputs.shape[1]
        self.lr = lr
        self.epochs = epochs
        self.hiddensSizes = hiddensSizes
        self.weights = np.empty(len(self.hiddensSizes) + 1)
        self.combinedLayers = np.hstack((self.inputsSize, self.hiddensSizes, self.outputsSize))
        for i in range(len((self.weights))):
            self.weights[i] = np.random.randn(self.combinedLayers[i], self.combinedLayers[i + 1]) #ERROR IS HERE
    
    
NN = NeuralNetwork(np.array([[0, 1, 0, 1, 1], [0, 0, 0, 0, 0]]), (3, 4), np.array([[0, 1, 0], [0, 0, 1]]), 0.1, 10000)
print(NN.weights)

【问题讨论】:

    标签: python arrays numpy oop neural-network


    【解决方案1】:

    由于np.random.randn(self.combinedLayers[i], self.combinedLayers[i + 1])的形状在变化,最好使用list

    # code code code
        self.weights = []
    # code code code
        for ....:
            self.weights.append(np.random.randn(self.combinedLayers[i], self.combinedLayers[i + 1]))
    # code code code
    

    但是如果你想使用NumPy,那么使用object数据类型为:

    # code code code
        self.weights =  np.empty(len(self.hiddensSizes) + 1, dtype = 'object')
    # code code code
    

    【讨论】:

      【解决方案2】:

      以下代码返回相同的错误。

      import numpy as np
      
      weights = np.empty(3)
      weights[0] = [1, 2]
      
      ValueError: setting an array element with a sequence.
      

      但这有效:

      weights[0] = 1
      

      数组的每个元素都应具有相同的维数(与标准的 Python 列表不同)。默认值为 1,这是在您的情况下使用的。 要指定深度,只需传入一个元组。 请看以下内容:

      weights = np.empty((3, 5))
      weights[0] = [1, 2]
      

      也会返回错误:

      ValueError: cannot copy sequence with size 2 to array axis with dimension 5
      

      但以下内容会起作用,因为我分配的列表具有预期的维度:

      weights[0] = [1, 2, 3, 4, 5]
      

      希望你从那里弄清楚。

      【讨论】:

      • 谢谢。虽然我已经通过设置 dtype='object'
      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2017-06-07
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多