- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我刚开始使用 numpy,我对如何使用数组感到困惑。我在 numpy 数组上看到了几个 Stack Overflow 的答案,但它们都涉及如何获得所需的结果(我知道如何做到这一点,我只是不知道为什么我需要这样做)。我所看到的共识是数组比矩阵更好,因为它们是更基本的类并且限制更少。我知道你可以转置一个数组,这对我来说意味着行和列之间存在区别,但乘法规则都会产生错误的输出(与我所期望的相比)。
这是我编写的测试代码以及输出:
a = numpy.array([1,2,3,4])
print(a)
>>> [1 2 3 4]
print(a.T) # Transpose
>>> [1 2 3 4] # No apparent affect
b = numpy.array( [ [1], [2], [3], [4] ] )
print(b)
>>> [[1]
[2]
[3]
[4]] # Column (Expected)
print(b.T)
>>> [[1 2 3 4]] # Row (Expected, transpose seems to work here)
print((b.T).T)
>>> [[1]
[2]
[3]
[4]] # Column (All of these are as expected,
# unlike for declaring the array as a row vector)
# The following are element wise multiplications of a
print(a*a)
>>> [ 1 4 9 16]
print(a * a.T) # Row*Column
>>> [ 1 4 9 16] # Inner product scalar result expected
print(a.T * a) # Column*Row
>>> [ 1 4 9 16] # Outer product matrix result expected
print(b*b)
>>> [[1]
[4]
[9]
[16]] # Expected result, element wise multiplication in a column
print(b * b.T) # Column * Row (Outer product)
>>> [[ 1 2 3 4]
[ 2 4 6 8]
[ 3 6 9 12]
[ 4 8 12 16]] # Expected matrix result
print(b.T * (b.T)) # Column * Column (Doesn't make much sense so I expected elementwise multiplication
>>> [[ 1 4 9 16]]
print(b.T * (b.T).T) # Row * Column, inner product expected
>>> [[ 1 2 3 4]
[ 2 4 6 8]
[ 3 6 9 12]
[ 4 8 12 16]] # Outer product result
我知道我可以使用 numpy.inner()
和 numpy.outer()
来实现效果(这不是问题),我只是想知道我是否需要跟踪我的向量是行还是列。
我还知道我可以创建一个一维矩阵来表示我的向量,并且乘法会按预期进行。我正在尝试找出存储数据的最佳方式,以便在查看代码时清楚将要发生什么 - 现在数学看起来很困惑且错误。
我的应用程序只需要使用一维和二维张量。
最佳答案
我会尝试注释您的代码
a = numpy.array([1,2,3,4])
print(a)
>>> [1 2 3 4]
print(a.T) # Transpose
>>> [1 2 3 4] # No apparent affect
a.shape
将显示 (4,)
。 a.T.shape
是一样的。它保持相同的维数,并执行唯一有意义的转置——没有变化。使其成为 (4,1)
会增加一个维度,并破坏 A.T.T
往返。
b = numpy.array( [ [1], [2], [3], [4] ] )
print(b)
>>> [[1]
[2]
[3]
[4]] # Column (Expected)
print(b.T)
>>> [[1 2 3 4]] # Row (Expected, transpose seems to work here)
b.shape
是(4,1)
,b.T.shape
是(1,4)
。注意额外的一组 []。如果您将 a
创建为 a = numpy.array([[1,2,3,4]])
,它的形状也将是 (1 ,4)
。
制作 b
的简单方法是 b=np.array([[1,2,3,4]]).T
(或 b=np.array([1,2,3,4])[:,None]
或 b=np.array([1,2,3,4]).reshape(-1 ,1)
)
将其与 MATLAB 进行比较
octave:3> a=[1,2,3,4]
a =
1 2 3 4
octave:4> size(a)
ans =
1 4
octave:5> size(a.')
ans =
4 1
即使没有额外的 [],它也会将矩阵初始化为 2d。
numpy
有一个模仿 MATLAB 的 matrix
类 - 在 MATLAB 只允许 2d 的时候。
In [75]: m=np.matrix('1 2 3 4')
在 [76] 中:m Out[76]: 矩阵([[1, 2, 3, 4]])
In [77]: m.shape
Out[77]: (1, 4)
In [78]: m=np.matrix('1 2; 3 4')
In [79]: m
Out[79]:
matrix([[1, 2],
[3, 4]])
我不建议使用 np.matrix
除非它真的可以为您的代码添加一些有用的东西。
请注意 MATLAB 中关于向量
的讨论,但它们实际上只是它们的矩阵
,只有一个非单一维度。
# The following are element wise multiplications of a
print(a*a)
>>> [ 1 4 9 16]
print(a * a.T) # Row*Column
>>> [ 1 4 9 16] # Inner product scalar result expected
此行为遵循 a.T == A
。正如您所指出的,*
产生逐个元素的乘法。这等效于 MATLAB .*
。 np.dot(a,a)
给出 2 个数组的点积或矩阵积。
print(a.T * a) # Column*Row
>>> [ 1 4 9 16] # Outer product matrix result expected
不,它仍在进行元素乘法。
我会使用广播
,a[:,None]*a[None,:]
来获得外积。 Octave 模仿 numpy 添加了这个;不知道 MATLAB 有没有。
在下面的*
中总是逐个元素相乘。产生矩阵/外积结果的是广播。
print(b*b)
>>> [[1]
[4]
[9]
[16]] # Expected result, element wise multiplication in a column
(4,1) * (4,1)=>(4,1)
。四周形状相同。
print(b * b.T) # Column * Row (Outer product)
>>> [[ 1 2 3 4]
[ 2 4 6 8]
[ 3 6 9 12]
[ 4 8 12 16]] # Expected matrix result
此处 (4,1)*(1,4)=>(4,4)
产品。 2 个大小的 1
维度已被复制,因此它实际上变成了 (4,4)*(4,4)
。您将如何在 MATLAB 中复制它 - 使用 .*
?
print(b.T * (b.T)) # Column * Column (Doesn't make much sense so I expected elementwise multiplication
>>> [[ 1 4 9 16]]
*
是按元素排列的,与预期无关。在 MATLAB 中思考 b' .* b'
。
print(b.T * (b.T).T) # Row * Column, inner product expected
>>> [[ 1 2 3 4]
[ 2 4 6 8]
[ 3 6 9 12]
[ 4 8 12 16]] # Outer product result
同样 *
是逐元素的; inner
除了乘法之外还需要求和。这里广播再次应用 (1,4)*(4,1)=>(4,4)
。
np.dot(b,b)
或 np.trace(b.T*b)
或 np.sum(b*b)
给出 30
。
当我在 MATLAB 工作时,我经常检查 size
,并创建测试矩阵来捕获维度不匹配(例如 2x3 而不是 2x2 矩阵)。我继续在 numpy 中这样做。
关键是:
numpy
数组可能是 1d(甚至 0d)
(4,) 数组与 (4,1)
或 (1,4)` 不完全相同。
*
始终是元素级的。
广播通常会解释外部
类行为
关于python - numpy 一维数组是否遵循行/列规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35252397/
作为脚本的输出,我有 numpy masked array和标准numpy array .如何在运行脚本时轻松检查数组是否为掩码(具有 data 、 mask 属性)? 最佳答案 您可以通过 isin
我的问题 假设我有 a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.arra
numpy 是否有用于矩阵模幂运算的内置实现? (正如 user2357112 所指出的,我实际上是在寻找元素明智的模块化减少) 对常规数字进行模幂运算的一种方法是使用平方求幂 (https://en
我已经在 Numpy 中实现了这个梯度下降: def gradientDescent(X, y, theta, alpha, iterations): m = len(y) for i
我有一个使用 Numpy 在 CentOS7 上运行的项目。 问题是安装此依赖项需要花费大量时间。 因此,我尝试 yum install pip install 之前的 numpy 库它。 所以我跑:
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示: data = [ [ 1, a, [, ] ], [ 1, b, [, ] ], [ 2,
numpy.random.seed(7) 在不同的机器学习和数据分析教程中,我看到这个种子集有不同的数字。选择特定的种子编号真的有区别吗?或者任何数字都可以吗?选择种子数的目标是相同实验的可重复性。
我需要读取存储在内存映射文件中的巨大 numpy 数组的部分内容,处理数据并对数组的另一部分重复。整个 numpy 数组占用大约 50 GB,我的机器有 8 GB RAM。 我最初使用 numpy.m
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示: data = [ [ 1, a, [, ] ], [ 1, b, [, ] ], [ 2,
似乎 numpy.empty() 可以做的任何事情都可以使用 numpy.ndarray() 轻松完成,例如: >>> np.empty(shape=(2, 2), dtype=np.dtype('d
我在大型 numpy 数组中有许多不同的形式,我想使用 numpy 和 scipy 计算它们之间的边到边欧氏距离。 注意:我进行了搜索,这与堆栈中之前的其他问题不同,因为我想获得数组中标记 block
我有一个大小为 (2x3) 的 numpy 对象数组。我们称之为M1。在M1中有6个numpy数组。M1 给定行中的数组形状相同,但与 M1 任何其他行中的数组形状不同。 也就是说, M1 = [ [
如何使用爱因斯坦表示法编写以下点积? import numpy as np LHS = np.ones((5,20,2)) RHS = np.ones((20,2)) np.sum([ np.
假设我有 np.array of a = [0, 1, 1, 0, 0, 1] 和 b = [1, 1, 0, 0, 0, 1] 我想要一个新矩阵 c 使得如果 a[i] = 0 和 b[i] = 0
我有一个形状为 (32,5) 的 numpy 数组 batch。批处理的每个元素都包含一个 numpy 数组 batch_elem = [s,_,_,_,_] 其中 s = [img,val1,val
尝试为基于文本的多标签分类问题训练单层神经网络。 model= Sequential() model.add(Dense(20, input_dim=400, kernel_initializer='
首先是一个简单的例子 import numpy as np a = np.ones((2,2)) b = 2*np.ones((2,2)) c = 3*np.ones((2,2)) d = 4*np.
我正在尝试平均二维 numpy 数组。所以,我使用了 numpy.mean 但结果是空数组。 import numpy as np ws1 = np.array(ws1) ws1_I8 = np.ar
import numpy as np x = np.array([[1,2 ,3], [9,8,7]]) y = np.array([[2,1 ,0], [1,0,2]]) x[y] 预期输出: ar
我有两个数组 A (4000,4000),其中只有对角线填充了数据,而 B (4000,5) 填充了数据。有没有比 numpy.dot(a,b) 函数更快的方法来乘(点)这些数组? 到目前为止,我发现
我是一名优秀的程序员,十分优秀!