2
import numpy as np
dx = 8
dy = 10
bx = 5.34
by = 1.09
index = np.zeros((dx+dy),dtype = 'int32')
for i in np.arange(1,dy+1):
    for j in np.arange (1,dx+1):
        if i-by > 0:
            theta = 180*np.arctan(abs(j-bx)/(i-by))/np.pi
            if theta<10:
                r = np.around(np.sqrt((j-bx)**2+(i-by)**2))
                r = r.astype(int)               
                if r>0:
                    index[r]+=1
                    output = np.zeros((r, index[r]),dtype='int32')
                    output[r-1,index[r]-1] = i+(j-1)*dy

このコードは (r, index[r]) をインデックスとして使用し、i+(j-1)*dy の値を対応するインデックスに配置し、それを次のように新しい行列/配列に記録する必要があります-

array([[ 0,  0,  0],
   [ 0,  0,  0],
   [44,  0,  0],
   [45, 55,  0],
   [46, 56,  0],
   [47, 57,  0],
   [48, 58,  0],
   [39, 49, 59],
   [40, 50, 60]]) 

しかし、私は望んでいない代わりにこのような出力を持っています-

array([[ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0,  0],
   [ 0,  0, 60]])
4

1 に答える 1

0

コードがをしようとしているかを伝えるのは困難です。目的の出力はsc、またはindexですか?

または、新しい配列を作成したい場合は、それを呼び出して、 atoutputの値をusing:に設定できます。outputscoutput[s] = c

事前にサイズがわからない場合、私が今考えることができる最善の方法は、 と のリスト内のすべてのインデックス値と、 のリスト内の実際の値を追跡するrowsことcolsですvalues

import numpy as np
dx = 8
dy = 10
bx = 5.34
by = 1.09
index = np.zeros(dx+dy,dtype = 'int32')
rows = []
cols = []
vals = []
for i in np.arange(2,dy+1):
    for j in np.arange(1,dx+1):
        theta = 180*np.arctan(abs(j-bx)/(i-by))/np.pi
        if theta < 10:
            r = np.around(np.sqrt((j-bx)**2+(i-by)**2))
            r = r.astype(int) 
            if r > 0:
                index[r] += 1
                rows.append(r-1)
                cols.append(index[r]-1)
                vals.append(i+(j-1)*dy)

outshape = max(rows)+1, max(cols)+1  # now you know the size
output = np.zeros(outshape, np.int)  
output[rows, cols] = vals

次に、output次のようになります。

In [60]: output
Out[60]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [44,  0,  0],
       [45, 55,  0],
       [46, 56,  0],
       [47, 57,  0],
       [48, 58,  0],
       [39, 49, 59],
       [40, 50, 60]])

事前にサイズが分かっている場合:

import numpy as np
dx = 8
dy = 10
bx = 5.34
by = 1.09
index = np.zeros(dx+dy,dtype = 'int32')
outshape = (nrows, ncols)                        # if you know the size
output = np.zeros(outshape, np.int)              # initialize the output matrix
for i in np.arange(2,dy+1):
    for j in np.arange(1,dx+1):
        theta = 180*np.arctan(abs(j-bx)/(i-by))/np.pi
        if theta < 10:
            r = np.around(np.sqrt((j-bx)**2+(i-by)**2))
            r = r.astype(int) 
            if r > 0:
                index[r] += 1
                output[r-1, index[r]-1] = i+(j-1)*dy  # no need to set `s` or `c`
于 2013-05-06T15:28:07.307 に答える