我的印象是,在NumPy中,两个阵列可以共享相同的内存.请看以下示例:
import numpy as np
a=np.arange(27)
b=a.reshape((3,3,3))
a[0]=5000
print (b[0,0,0]) #5000
#Some tests:
a.data is b.data #False
a.data == b.data #True
c=np.arange(27)
c[0]=5000
a.data == c.data #True ( Same data, not same memory storage ), False positive
Run Code Online (Sandbox Code Playgroud)
所以显然b没有复制a; 它只是创建了一些新的元数据并将其附加到a正在使用的相同内存缓冲区中.有没有办法检查两个数组是否引用相同的内存缓冲区?
我的第一印象是使用a.data is b.data,但返回false.我能做的a.data == b.data,返回真,但我不认为检查,以确保a和b共享相同的内存缓冲区,只有内存块被引用a和引用的一个b具有相同的字节.
为什么这个程序
import numpy as np
c = np.array([1,2])
print(c.shape)
d = np.array([[1],[2]]).transpose()
print(d.shape)
Run Code Online (Sandbox Code Playgroud)
给
(2,)
(1,2)
Run Code Online (Sandbox Code Playgroud)
作为其输出?不应该
(1,2)
(1,2)
Run Code Online (Sandbox Code Playgroud)
代替?我在python 2.7.3和python 3.2.3中都得到了这个
我有1000个RGB图像(64X64),我想将其转换为(m,n)数组.
我用这个:
import numpy as np
from skdata.mnist.views import OfficialImageClassification
from matplotlib import pyplot as plt
from PIL import Image
import glob
import cv2
x_data = np.array( [np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))] )
print x_data.shape
Run Code Online (Sandbox Code Playgroud)
这给了我: (1000, 64, 64, 3)
如果我这样做:
pixels = x_data.flatten()
print pixels.shape
Run Code Online (Sandbox Code Playgroud)
我明白了: (12288000,)
但是,我需要一个具有以下尺寸的数组: (1000, 12288)
我怎样才能做到这一点?
我是python和numpy的新手.我阅读了几个教程,但仍然对昏暗,等级,形状,aix和尺寸的差异感到困惑.我的想法似乎停留在矩阵表示.所以如果你说A是一个看起来像这样的矩阵:
A =
1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)
那么我能想到的只是一个2x3矩阵(两行三列).在这里,我知道形状是2x3.但我真的无法超越二维矩阵的思维.我不明白例如dot()文档,当它表示"对于N维,它是a的最后一个轴上的和产品,而b的倒数第二个".我很困惑,无法理解这一点.我不明白,如果V是N:1向量而M是N:N矩阵,点(V,M)或点(M,V)如何工作以及它们之间的差异.
那么有人可以向我解释什么是N维数组,什么是形状,什么是轴以及它如何与dot()函数的文档相关?如果解释可视化这些想法会很棒.
我尝试搜索 StackOverflow、谷歌搜索,甚至使用符号猎犬进行字符搜索,但无法找到答案。具体来说,我对Ch感到困惑。Nielsen 的Neural Networks and Deep Learning 的第 1 章,他说“假设输入a是(n, 1) Numpy ndarray,而不是(n,) vector。”
起初我认为(n,)指的是数组的方向 - 所以它可能指的是一列向量,而不是只有一行的向量。但我不明白为什么我们需要(n,)和(n, 1)两个-他们似乎在说同样的事情。我知道我误解了一些东西,但我不确定。
作为参考a,激活向量将输入到神经网络的给定层,然后通过权重和偏差进行转换以生成下一层的激活输出向量。
编辑:这个问题在“一列向量”(没有这样的东西)和“一列矩阵”(确实存在)之间模棱两可。“一行向量”和“一行矩阵”也是如此。
向量只是一个数字列表,或(等价地)向量空间基向量上的标量变换列表。如果一个向量只有一行(或一列),那么当我们将它写出来时,它可能看起来像一个矩阵。令人困惑的是,我们有时会提到“激活向量”,但实际上是指“转置的单行激活值矩阵,使其成为单列”。
请注意,在这两种情况下,我们都不是在讨论一维向量,该向量将是一个仅由一个数字定义的向量(除非,平凡地,n==1,在这种情况下,“列”或“行”区别的概念将毫无意义)。
我不确定 numpy 中 (N,) 和 (N,1) 之间的区别。假设两者都是一些特征,它们具有相同的N维,并且都有一个样本。有什么不同?
a = np.ones((10,))
print(a.shape) #(10,)
b = np.ones((10,1))
print(b.shape) #(10,1)
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的numpy数组:
candidates =
array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1],
[1, 0, 1, 1, 1, 1, 0, 0, 1, …Run Code Online (Sandbox Code Playgroud) 一段时间以来,我一直很好奇.我可以忍受这种情况,但是如果不采取足够的照顾,它总会咬我,所以我决定将它发布在这里.假设以下示例(Numpy版本= 1.8.2):
a = array([[0, 1], [2, 3]])
print shape(a[0:0, :]) # (0, 2)
print shape(a[0:1, :]) # (1, 2)
print shape(a[0:2, :]) # (2, 2)
print shape(a[0:100, :]) # (2, 2)
print shape(a[0]) # (2, )
print shape(a[0, :]) # (2, )
print shape(a[:, 0]) # (2, )
Run Code Online (Sandbox Code Playgroud)
我不知道其他人的感受,但结果与我不一致.最后一行是列向量,而倒数第二行是行向量,它们应该具有不同的维度 - 在线性代数中它们可以做到!(第5行是另一个惊喜,但我暂时忽略它).考虑第二个例子:
solution = scipy.sparse.linalg.dsolve.linsolve.spsolve(A, b) # solution of dimension (n, )
analytic = reshape(f(x, y), (n, 1)) # analytic of dimension (n, 1)
error = solution - analytic
Run Code Online (Sandbox Code Playgroud)
现在错误是维度(n,n).是的,在第二行我应该使用(n,)而不是(n,1),但为什么呢?我以前经常使用MATLAB,其中一维向量具有维度(n,1),linspace/arange返回维度(n,1)的数组,并且从不存在(n,).但是在Numpy(n,1)和(n,)共存时,维度处理有很多功能:至少,newaxis和reshape的不同用途,但对我来说,这些功能更多的是混乱而不是帮助.如果数组打印如[1,2,3],那么直观地说维度应该是[1,3]而不是[3,],对吗?如果Numpy没有(n,),我只能看到清晰度的增益,而不是功能上的损失. …
我是 Python 的初学者。我曾经密集地使用matlab。现在我正在转向python。我有一个关于数组维数的问题。
我导入 Numpy
我首先创建一个数组 X,然后我使用一些嵌入的函数,比如 sum,来处理我的数组。最终,当我尝试检查数组 X 的维数时,它变成了:X.shape,outputs (81,)。数字 81 是我所期望的,但我也期望第 2 维是 1,而不仅仅是省略。这让我感到很不舒服,即使我直接输入X,它也输出正确,即一列和X中的数字都符合预期。
然后,当我使用另一个数组 Y 时,它实际上具有 Y.shape,输出 (81,1),然后如果我键入 X*Y,我希望看到一个维度数组 (81,1) 但相反,我看到了一个维数数组 (81,81)。
我不知道产生这个结果的潜在机制是什么。
我解决这个问题的方法很愚蠢。我首先创建一个新数组 C = zeros((81,1)),所以 C 字面上有维度 (81,1),然后我通过键入 C[:,0]=X 将我的 X 分配给 C,然后是 C.shape = (81,1)。请注意,如果我输入 C=X,则 C.shape=(81,),这又回到了我的问题。所以我可以解决我的问题,但我确信有更好的方法来解决我的问题,我也不明白为什么 python 会产生像 (81,) 这样的东西,省略了第二维。
我最近遇到了一些错误,因为 numpy 数组的形状为 (x,) - 这些可以通过下面的代码片段轻松修复
a = np.array([1,2,3,4]) #this form produced a bug
a.shape
>>> (4,)
a.shape = [4,1] #but this change fixed it
Run Code Online (Sandbox Code Playgroud)
但这确实让我想知道,为什么 (x,) 是一维数组的默认形状?
说:
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)
arr2d[:, :1] 给我
array([[1],
[4],
[7]])
Run Code Online (Sandbox Code Playgroud)
arr2d[:,0] 给我
array([1, 4, 7])
Run Code Online (Sandbox Code Playgroud)
我以为他们会产生完全相同的东西.
我注意到对于一个排名为1的数组,其中3个元素为numpy返回(3,)形状.我知道这个元组代表了每个维度上数组的大小,但为什么不是它(3,1)呢?
import numpy as np
a = np.array([1, 2, 3]) # Create a rank 1 array
print a.shape # Prints "(3,)"
b = np.array([[1,2,3],[4,5,6]]) # Create a rank 2 array
print b.shape # Prints "(2, 3)"
Run Code Online (Sandbox Code Playgroud)