1

numpy では、行に n 、列に m を入力して、次のような配列で終了できるようにしたいと考えています。

[(0,0,0,0),
 (1,1,1,1),
 (2,2,2,2)]

つまり、3x4 になります。各列は前の列の単なるコピーであり、行は毎回 1 ずつ増加します。例として、入力は 4、次に 6 となり、出力は配列になります。

[(0,0,0,0,0,0),
 (1,1,1,1,1,1),
 (2,2,2,2,2,2),
 (3,3,3,3,3,3)]

行が 1 ずつ増える 4 行 6 列。御時間ありがとうございます。

4

9 に答える 9

5

非常に多くの可能性...

In [51]: n = 4

In [52]: m = 6

In [53]: np.tile(np.arange(n), (m, 1)).T
Out[53]: 
array([[0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3]])

In [54]: np.repeat(np.arange(n).reshape(-1,1), m, axis=1)
Out[54]: 
array([[0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3]])

In [55]: np.outer(np.arange(n), np.ones(m, dtype=int))
Out[55]: 
array([[0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3]])

ここにもう 1 つあります。ここでの巧妙なトリックは、値が複製されないことです。単一のシーケンス [0, 1, 2, ..., n-1] のメモリのみが割り当てられます。

In [67]: from numpy.lib.stride_tricks import as_strided

In [68]: seq = np.arange(n)

In [69]: rep = as_strided(seq, shape=(n,m), strides=(seq.strides[0],0))

In [70]: rep
Out[70]: 
array([[0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3]])

関数に注意してくださいas_strided。引数を正しく取得しないと、Python がクラッシュする可能性があります。

seqコピーされていないことを確認するには、そのseq場で変更してから確認しrepます。

In [71]: seq[1] = 99

In [72]: rep
Out[72]: 
array([[ 0,  0,  0,  0,  0,  0],
       [99, 99, 99, 99, 99, 99],
       [ 2,  2,  2,  2,  2,  2],
       [ 3,  3,  3,  3,  3,  3]])
于 2013-09-26T00:06:31.773 に答える
1

楽しみのためにもっと

np.zeros((n, m), dtype=np.int) + np.arange(n, dtype=np.int)[:,None]
于 2013-09-26T00:31:42.690 に答える
1

前述したように、これを行うには多くの方法があります。これが私がすることです:

import numpy as np
def makearray(m, n):
    A = np.empty((m,n))
    A.T[:] = np.arange(m)
    return A

これは、配列の内容を変更しない場合に機能する面白い代替手段です。メモリを節約する必要があります。ただし、これは完全な配列を割り当てないため、同じメモリアドレスを指す複数のエントリがあることに注意してください。

import numpy as np
from numpy.lib.stride_tricks import as_strided
def makearray(m, n):
    A = np.arange(m)
    return as_strided(A, strides=(A.strides[0],0), shape=(m,n))

どちらの場合でも、私が書いたように、3x4配列は次のように作成できますmakearray(3, 4)

于 2013-09-26T00:57:25.800 に答える
1
import numpy as np

def foo(n, m):
    return np.array([np.arange(n)] * m).T
于 2013-09-25T23:24:18.430 に答える
0

count組み込みモジュールからの使用itertools:

>>> from itertools import count
>>> rows = 4
>>> columns = 6
>>> cnt = count()
>>> [[cnt.next()]*columns for i in range(rows)]
[[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3]]
于 2013-09-25T23:30:30.577 に答える
0

(n,1) 配列を使用した他のいくつかの可能性

a = np.arange(n)[:,None]  (or np.arange(n).reshape(-1,1))

a*np.ones((m),dtype=int)

a[:,np.zeros((m),dtype=int)]

(m,) 配列と一緒に使用する場合は、(n,1) のままにし、ブロードキャストに拡張させます。

于 2013-09-26T02:26:00.863 に答える