Python 分配零的numpy数组中的元素

Python 分配零的numpy数组中的元素,python,python-3.x,numpy,Python,Python 3.x,Numpy,我试图通过将某些行和列指定给255,在numpy数组np.zeros28,28上绘制一个1。我编写了以下代码: one = np.zeros((28, 28)) one[12:15][5:23] = 255 我得到的输出是一个简单的零数组,没有任何变化。有人能解释一下这种奇怪的行为吗 奖金 如果您交换[12:15]和[5:23],则第17行到第19行将填充255行。使用一个[12:15][5:23]首先从12行到15行中选择3行,然后从这3行中选择第5行到第23行。这些行不存在,则不更新任何内

我试图通过将某些行和列指定给255,在numpy数组np.zeros28,28上绘制一个1。我编写了以下代码:

one = np.zeros((28, 28))
one[12:15][5:23] = 255
我得到的输出是一个简单的零数组,没有任何变化。有人能解释一下这种奇怪的行为吗

奖金

如果您交换[12:15]和[5:23],则第17行到第19行将填充255行。

使用一个[12:15][5:23]首先从12行到15行中选择3行,然后从这3行中选择第5行到第23行。这些行不存在,则不更新任何内容

更新第12至15行与第5至23列交叉的语法为

one[12:15,5:23] = 255
使用[12:15][5:23]时,首先从12到15行中选择3行,然后从这3行中选择第5到23行。这些行不存在,则不更新任何内容

更新第12至15行与第5至23列交叉的语法为

one[12:15,5:23] = 255

扩展jpl的答案:如果您处理的是python的列表数据结构,那么您的语法将是正确的。但是您正在处理的是numpy的ndarray数据结构,所以它不是,jpl语法是正确的。

扩展jpl的答案:如果您处理的是python的列表数据结构,那么您的语法将是正确的。但是您正在处理numpy的ndarray数据结构,因此它不是,jpl语法是正确的。

您使用的符号是有效的,但与您预期的有很大不同。Numpy索引由元组组成,每个维度一个元素。您试图获取的索引如下所示

one[(12:15, 5:23)] = 255
为了方便起见,python允许您删除括号,因此几乎每个人都可以编写

one[12:15, 5:23] = 255
记住这只是包含切片对象的元组的简写,这很有用,因为有时您必须在外部构建它

让我们看看原始索引的实际功能。python中的每个括号表达式都是对_getitem或_setitem的调用。您的索引可以重写为

view = one[12:15]  # __getitem__
view[5:23] = 255   # __setitem__
您可以传入一个小于维度数的元组。在这种情况下,前导维度被索引,其余所有维度都是隐式的。这实际上意味着你正在有效地做

view = one[12:15, :]
view[5:23, :] = 255
视图是第12-14行(包括第12-14行)的切片。它是一个3x28阵列。与python约定一致,numpy允许您将索引分配到数组末尾之后,不做任何静默操作。视图只有3行,因此指定行5-22不起任何作用


希望这能让你的编辑中的情况变得清晰。如果抓取第5-22行,将得到一个18x28的切片,偏移5行。此切片有第12-14行,因此您最终将在原始数组中设置第12+5行、第13+5行和第14+5行。

您使用的符号是有效的,但执行的操作与您预期的非常不同。Numpy索引由元组组成,每个维度一个元素。您试图获取的索引如下所示

one[(12:15, 5:23)] = 255
为了方便起见,python允许您删除括号,因此几乎每个人都可以编写

one[12:15, 5:23] = 255
记住这只是包含切片对象的元组的简写,这很有用,因为有时您必须在外部构建它

让我们看看原始索引的实际功能。python中的每个括号表达式都是对_getitem或_setitem的调用。您的索引可以重写为

view = one[12:15]  # __getitem__
view[5:23] = 255   # __setitem__
您可以传入一个小于维度数的元组。在这种情况下,前导维度被索引,其余所有维度都是隐式的。这实际上意味着你正在有效地做

view = one[12:15, :]
view[5:23, :] = 255
视图是第12-14行(包括第12-14行)的切片。它是一个3x28阵列。与python约定一致,numpy允许您将索引分配到数组末尾之后,不做任何静默操作。视图只有3行,因此指定行5-22不起任何作用


希望这能让你的编辑中的情况变得清晰。如果抓取第5-22行,将得到一个18x28的切片,偏移5行。此切片有第12-14行,因此您最终在原始数组中设置了第12+5行、第13+5行和第14+5行。

我可以问一下,您到底想用这段代码做什么吗?我根本没有认真做什么,只是尝试创建我自己的唯一数字来了解神经网络的工作方式。更新以解决您的编辑问题。我可以问一下您实际上是想用这些代码做什么吗?我根本没有做什么严肃的事情,只是尝试创建我自己的唯一数字来了解神经网络的工作方式。更新以解决您的编辑问题为什么?语法一点也不无效。理解为什么一个行可以工作,而另一个不行,比简单地插入它更重要。使用[12:15]中的一个,您从12到15中选择行,然后获得3行。然后添加[5:23]以从这3行中选择第5行到第23行。这些行不存在,则不更新任何内容。更新第12至15行与第5至23列交叉的语法为[12:15,5:23]如果有人得到答案,请将其张贴在此处。您要做什么
你不明白我最后的评论吗?是预先定义了[12:15,5:23]还是numpy的?每个[]意味着选择一个新的行和列对?为什么?语法一点也不无效。理解为什么一个行可以工作,而另一个不行,比简单地插入它更重要。使用[12:15]中的一个,您从12到15中选择行,然后获得3行。然后添加[5:23]以从这3行中选择第5行到第23行。这些行不存在,则不更新任何内容。更新第12到15行与第5到23列交叉的语法是[12:15,5:23],如果有人得到答案,请发到这里。我最后的评论中你不明白什么?是预定义了[12:15,5:23]还是numpy的?每个[]表示选择一个新的行和列对?语法完全有效。为什么它不工作?它不工作是因为它在numpy数组上运行,因此无效,如果它在python列表上运行,它将是有效的。x[slice1][slice2]同时适用于列表和数组。Python计算temp=x[slice1],然后计算temp1=temp[slice2]。列表的一部分仍然是一个列表;数组的切片具有相同的维数。标量索引的x[i][j]是不同的,每一步都会减少嵌套或维数。语法完全有效。为什么它不工作?它不工作是因为它在numpy数组上运行,因此无效,如果它在python列表上运行,它将是有效的。x[slice1][slice2]同时适用于列表和数组。Python计算temp=x[slice1],然后计算temp1=temp[slice2]。列表的一部分仍然是一个列表;数组的切片具有相同的维数。标量索引的x[i][j]是不同的,每一步都会减少嵌套或维数。