Python [:, :] 在 NumPy 数组上是什么意思
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16815928/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What does [:, :] mean on NumPy arrays
提问by user2432721
Sorry for the stupid question. I'm programming on PHP but found some nice code on Python and want to "recreate" it on PHP. But I'm quite frustrated about the line
对不起,这个愚蠢的问题。我正在用 PHP 编程,但在 Python 上找到了一些不错的代码,并想在 PHP 上“重新创建”它。但我对这条线很沮丧
self.h = -0.1
self.activity = numpy.zeros((512, 512)) + self.h
self.activity[:, :] = self.h
But I don't understand what does
但我不明白是什么
[:, :]
mean.
意思。
Besides I wasn't able to "Google It".
此外,我无法“谷歌它”。
Full code
完整代码
import math
import numpy
import pygame
from scipy.misc import imsave
from scipy.ndimage.filters import gaussian_filter
class AmariModel(object):
def __init__(self, size):
self.h = -0.1
self.k = 0.05
self.K = 0.125
self.m = 0.025
self.M = 0.065
self.stimulus = -self.h * numpy.random.random(size)
self.activity = numpy.zeros(size) + self.h
self.excitement = numpy.zeros(size)
self.inhibition = numpy.zeros(size)
def stimulate(self):
self.activity[:, :] = self.activity > 0
sigma = 1 / math.sqrt(2 * self.k)
gaussian_filter(self.activity, sigma, 0, self.excitement, "wrap")
self.excitement *= self.K * math.pi / self.k
sigma = 1 / math.sqrt(2 * self.m)
gaussian_filter(self.activity, sigma, 0, self.inhibition, "wrap")
self.inhibition *= self.M * math.pi / self.m
self.activity[:, :] = self.h
self.activity[:, :] += self.excitement
self.activity[:, :] -= self.inhibition
self.activity[:, :] += self.stimulus
class AmariMazeGenerator(object):
def __init__(self, size):
self.model = AmariModel(size)
pygame.init()
self.display = pygame.display.set_mode(size, 0)
pygame.display.set_caption("Amari Maze Generator")
def run(self):
pixels = pygame.surfarray.pixels3d(self.display)
index = 0
running = True
while running:
self.model.stimulate()
pixels[:, :, :] = (255 * (self.model.activity > 0))[:, :, None]
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
elif event.key == pygame.K_s:
imsave("{0:04d}.png".format(index), pixels[:, :, 0])
index = index + 1
elif event.type == pygame.MOUSEBUTTONDOWN:
position = pygame.mouse.get_pos()
self.model.activity[position] = 1
pygame.quit()
def main():
generator = AmariMazeGenerator((512, 512))
generator.run()
if __name__ == "__main__":
main()
采纳答案by Mike Müller
The [:, :]stands for everything from the beginning to the end just like for lists. The difference is that the first :stands for first and the second :for the second dimension.
该[:, :]代表一切从开始到结束,就像对列表。区别在于第一个:代表第一:维,第二个代表第二维。
a = numpy.zeros((3, 3))
In [132]: a
Out[132]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
Assigning to second row:
分配给第二行:
In [133]: a[1, :] = 3
In [134]: a
Out[134]:
array([[ 0., 0., 0.],
[ 3., 3., 3.],
[ 0., 0., 0.]])
Assigning to second column:
分配给第二列:
In [135]: a[:, 1] = 4
In [136]: a
Out[136]:
array([[ 0., 4., 0.],
[ 3., 4., 3.],
[ 0., 4., 0.]])
Assigning to all:
分配给所有人:
In [137]: a[:] = 10
In [138]: a
Out[138]:
array([[ 10., 10., 10.],
[ 10., 10., 10.],
[ 10., 10., 10.]])
回答by mgilson
This is slice assignment. Technically, it calls1
这是切片分配。从技术上讲,它调用1
self.activity.__setitem__((slice(None,None,None),slice(None,None,None)),self.h)
which sets all of the elements in self.activityto whatever value self.his storing. The code you have there really seems redundant. As far as I can tell, you could remove the addition on the previous line, or simply use slice assignment:
它将所有元素设置为存储的self.activity任何值self.h。你在那里的代码似乎真的是多余的。据我所知,您可以删除前一行的添加,或者简单地使用切片分配:
self.activity = numpy.zeros((512,512)) + self.h
or
或者
self.activity = numpy.zeros((512,512))
self.activity[:,:] = self.h
Perhaps the fastest way to do this is to allocate an empty array and .fillit with the expected value:
也许最快的方法是分配一个空数组和.fill它的期望值:
self.activity = numpy.empty((512,512))
self.activity.fill(self.h)
1Actually, __setslice__is attempted before calling __setitem__, but __setslice__is deprecated, and shouldn't be used in modern code unless you have a really good reason for it.
1实际上,__setslice__在调用 之前尝试过__setitem__,但__setslice__已弃用,除非您有充分的理由,否则不应在现代代码中使用。
回答by njzk2
numpy uses tuples as indexes. In this case, this is a detailed slice assignement.
numpy 使用元组作为索引。在这种情况下,这是一个详细的切片分配。
[0]
#means line 0 of your matrix
[(0,0)] #means cell at 0,0 of your matrix
[0:1] #means lines 0 to 1 excluded of your matrix
[:1] #excluding the first value means all lines until line 1 excluded
[1:] #excluding the last param mean all lines starting form line 1 included
[:] #excluding both means all lines
[::2] #the addition of a second ':' is the sampling. (1 item every 2)
[::] #exluding it means a sampling of 1
[:,:] #simply uses a tuple (a single , represents an empty tuple) instead of an index.
It is equivalent to the simpler
它相当于更简单的
self.activity[:] = self.h
(which also works for regular lists as well)
(这也适用于常规列表)

