Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)对矩阵列的赋值返回所有零';s_Python_Numpy_Matrix - Fatal编程技术网

(Python)对矩阵列的赋值返回所有零';s

(Python)对矩阵列的赋值返回所有零';s,python,numpy,matrix,Python,Numpy,Matrix,我不熟悉Python和NumPy,并且尝试创建一个具有平均规范化和特性缩放的矩阵类。当我运行一个简单的示例时,标准化将返回一列所有的零。我试着寻找它,但只找到了copy()thingy,这不太适用。代码如下,有什么建议吗 #/usr/bin/env python 将numpy作为np导入 类别矩阵(对象): 定义初始化(self,X=[]): self.X=X self.normalized=False self.\u calcColumnVars() def_calcColumnVars(se

我不熟悉Python和NumPy,并且尝试创建一个具有平均规范化和特性缩放的矩阵类。当我运行一个简单的示例时,标准化将返回一列所有的零。我试着寻找它,但只找到了
copy()
thingy,这不太适用。代码如下,有什么建议吗

#/usr/bin/env python
将numpy作为np导入
类别矩阵(对象):
定义初始化(self,X=[]):
self.X=X
self.normalized=False
self.\u calcColumnVars()
def_calcColumnVars(self):#这东西有办法和东西
self.mean=np.array([])
self.minimum=np.array([])
self.max=np.array([])
对于范围(0,len(self.X[0])内的ii:
self.mean=np.append(self.mean,np.mean(self.X[:,ii]))
self.minimum=np.append(self.minimum,np.min(self.X[:,ii]))
self.max=np.append(self.max,np.max(self.X[:,ii]))
def规格化(自身):#通过平均值进行偏移并规格化到范围
对于范围(0,len(self.X[0])内的ii:
如果自最小值[ii]==自最大值[ii]:
continue#该列包含所有相同的元素
self.X[:,ii]=(self.X[:,ii]-自平均值[ii])/(自最大值[ii]-自最小值[ii])
self.normalized=True
def显示(自我):
打印“X=%s”%np.array\u str(self.X);
打印“平均值=%s”%np.array\u str(self.Mean,精度=2);
打印“最小值=%s”%np.array\u str(自最小值,精度=2);
打印“Max=%s”%np.array\u str(self.Max,精度=2);
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
X=正规矩阵(np.数组([[1,1,1,1],[89,72,94,69],[1,2,3,4]])。转置()
X.show()
十、规范化
X.show()
我的输出:

X=[[1]
[ 1 72  2]
[ 1 94  3]
[ 1 69  4]]
平均值=[1.81.2.5]
Min=[1.69.1]
Max=[1.94.4]
X=[[1 0]
[1 0 0]
[1 0 0]
[1 0 0]]
平均值=[1.81.2.5]
Min=[1.69.1]
Max=[1.94.4]

当数组具有整数数据类型时,除法返回整数:

In [5]: X = np.array([[1,1,1,1], [89,72,94,69], [1,2,3,4]])

In [7]: X.dtype
Out[7]: dtype('int64')

In [6]: X / 100
Out[6]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
相反,如果数组具有浮点数据类型,则除法返回浮点:

In [8]: X = np.array([[1,1,1,1], [89,72,94,69], [1,2,3,4]])

In [9]: X = X.astype(float)

In [11]: X.dtype
Out[11]: dtype('float64')

In [10]: X / 100
Out[10]: 
array([[ 0.01,  0.01,  0.01,  0.01],
       [ 0.89,  0.72,  0.94,  0.69],
       [ 0.01,  0.02,  0.03,  0.04]])

您的代码可以通过更改

    self.X = X
NormMatrix.\uuuu init\uuuu
中:

    self.X = np.asarray(X, dtype=float)

此外,您还可以通过删除循环的
来更好地利用NumPy,而不是使用NumPy
mean
min
max
方法。
axis=0
参数告诉这些方法在行上取
平均值(或
min
max
)。结果是一个数组,每列有一个值。指定
axis=0
将删除0轴:

def _calcColumnVars(self):         # This thing gets the means and stuff
    self.mean = self.X.mean(axis=0)
    self.minimum = self.X.min(axis=0)
    self.maximum = self.X.max(axis=0)
并通过使用执行归一化算法:

def normalize(self):       # Offset by mean and normalize to range
    normed = (self.X - self.mean) / (self.maximum - self.minimum)
    self.X = np.where(np.isnan(normed), self.X, normed)
    self.normalized = True

天哪,我真傻!!!花了一整天的时间在这上面,却没有注意到!!!非常感谢你!如果我使用NumPy广播,有没有办法检查(max-min)是否返回0?如果没有办法,我就不能使用它:(如果X是一个具有浮点数据类型的数组,则除以零返回
nan
。在这种情况下,要保留
X
的值,可以使用
np.isnan
来标识这些位置,并使用
np.where
返回一个填充了
self.X
where
np.isnan(X)值的数组。)
为真,而从
normed
则为假。(参见上面的代码)。当数组有很多列时,这将比使用
for loop
更快。如果数组很小,则
for loop
可能更快。更正,在答案的广播部分-应该是“self.X=np.where(np.isnan)(normed),self.X,标准化)