web-dev-qa-db-ja.com

NumPy配列で[:、:]はどういう意味ですか

バカな質問でごめんなさい。私はPHPでプログラミングしていますが、Pythonでニースのコードを見つけて、PHPでそれを「再作成したいのですが。

self.h = -0.1    
self.activity = numpy.zeros((512, 512)) + self.h
self.activity[:, :] = self.h

しかし、私は何を理解していない

[:, :]

平均。

それに、「Google It」はできませんでした。

完全なコード

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()
29
user2432721

[:, :]は、リストのように最初から最後までのすべてを表します。違いは、最初の:は1番目と2番目の: 2番目の次元。

a = numpy.zeros((3, 3))

In [132]: a
Out[132]: 
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

2行目に割り当てる:

In [133]: a[1, :] = 3

In [134]: a
Out[134]: 
array([[ 0.,  0.,  0.],
       [ 3.,  3.,  3.],
       [ 0.,  0.,  0.]])

2列目に割り当てる:

In [135]: a[:, 1] = 4

In [136]: a
Out[136]: 
array([[ 0.,  4.,  0.],
       [ 3.,  4.,  3.],
       [ 0.,  4.,  0.]])

すべてに割り当てる:

In [137]: a[:] = 10

In [138]: a
Out[138]: 
array([[ 10.,  10.,  10.],
       [ 10.,  10.,  10.],
       [ 10.,  10.,  10.]])
36
Mike Müller

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.

より単純なものと同等です

self.activity[:] = self.h

(通常のリストでも機能します)

14
njzk2

これはスライスの割り当てです。技術的には、それは呼び出します1

self.activity.__setitem__((slice(None,None,None),slice(None,None,None)),self.h)

self.activityのすべての要素を、self.hが保存している値に設定します。そこにあるコードは本当に冗長なようです。私が知る限り、前の行の追加を削除するか、単にスライスの割り当てを使用することができます:

self.activity = numpy.zeros((512,512)) + self.h

または

self.activity = numpy.zeros((512,512))
self.activity[:,:] = self.h

おそらくこれを行うための最速の方法は、空の配列を割り当て、.fillに期待される値を割り当てることです。

self.activity = numpy.empty((512,512))
self.activity.fill(self.h)

1実際、__setslice____setitem__を呼び出す前に試行されますが、__setslice__は非推奨であり、特に正当な理由がない限り、現代のコードでは使用しないでください。

11
mgilson