0

入力として受け取る配列の設定方法に応じて、異なる応答をする関数があります。機能しない方法では、関数は引き続き実行されますが、正しくはありません

働く方法:

import numpy as np
array1 = ["something1", "a,b,c,9", "more", "b,c,4"]
array2 = ["something2", "4,3", "more", "1,a"]
array3 = ["something3", "z", "more", "9,1"]
array4 = ["something4", "1", "more", "z"]
real_array = np.array((array1,array2,array3,array4))

うまくいかない方法:

import numpy as np
array = [["something1", "a,b,c,9", "more", "b,c,4"],["something2", "4,3", "more", "1,a"],["something3", "z", "more", "9,1"],["something4", "1", "more", "z"]]
real_array = np.array((array))

同様の機能しない方法:

import numpy as np
import csv
array = []
reading = csv.reader(open('file.csv', 'rb'))
for row in reading:
    array.append(row)
real_array = np.array((array))

array行を追加することができ、他の方法は手動で行う必要があるため、明らかに機能しない方法の方がデータを処理する方が簡単です。


両方の配列は同じです...では、なぜ私の関数はそれらに異なって応答するのですか?


私の関数は、ファイルから行をランダムに選択し、2 番目の列の何かが前の選択の最後の列の何かと一致するかどうかを確認します。ここにあります:

def make_sequence(size,array):
        count = 0
        without_column = array[1::]
        np.random.shuffle(without_column)
        sequence = [without_column[0]]
        result = [without_column[0][0]]
        length = 0
        while length < size:
            np.random.shuffle(without_column)
            start = without_column[0][1].split(',')
            end = sequence[count][3].split(',')
            i = 0
            while i < len(start):
                if start[i] in end:
                    sequence.append(without_column[0])
                    result.append(without_column[0][0])
                    count += 1
                    i = len(start)
                else:
                    pass
                i += 1
            length = len(result)
        return result

編集2:どうなるか


このコードを実行すると:

make_sequence(10,real_array)

毎回異なる、1 列目のみで構成される配列を返したいのですが、2 番目のアイテムの開始位置が 1 番目の終了位置の 1 つである場合にのみ、アイテムを隣り合わせに配置します。次に例を示します。

選択された最初の項目が array3 の場合、次の項目は array1 または array4 のみであり、他はありません。これは、配列 3 の列 4 が 9,1 であるためです。これは、その後に続く唯一の配列の 2 列目に 9 または 1 が必要であることを意味します。

したがって、ランダムに選択された最初の項目が array3 の場合、次のコードを実行すると:

make_sequence(2,real_array)

次の出力の可能性しかありません。

[「何か3」、「何か4」]

[「何か3」、「何か1」]

4

3 に答える 3

1

私は解決策を見つけました!ファイルをnumpy配列にまったく実行しない場合、関数は完全に機能します...ここで機能したのは次のとおりです。

import numpy as np
import csv
array = []
reading = csv.reader(open('file.csv', 'rb'))
for row in reading:
    array.append(row)
make_sequence(10,array)

配列を numpy 配列に変換しないと、関数は完全に機能します。

未だに原因がわからないのですが、わかる方いたら教えてください

于 2013-04-23T18:29:24.297 に答える
0

はい、あなたの配列は私と同じようです。Rob のテストに加えて、次のことも確認できます。

real_array1.shape == real_array2.shape
real_array1.dtype == real_array2.dtype

両方とも戻るTrue

ただし、関数はランダムな行を使用します。もちろん、毎回異なる結果を返します。もっと注意深く読まないと、コードが何をすべきかわかりませんが、問題は、without_column配列が実際には最初ののない配列である可能性があります。

In [15]: without_column = real_array1[1::]

In [16]: real_array1
Out[16]: 
array([['something1', 'a,b,c,9', 'more', 'b,c,4'],
       ['something2', '4,3', 'more', '1,a'],
       ['something3', 'z', 'more', '9,1'],
       ['something4', '1', 'more', 'z']], 
      dtype='|S10')

In [17]: without_column
Out[17]: 
array([['something2', '4,3', 'more', '1,a'],
       ['something3', 'z', 'more', '9,1'],
       ['something4', '1', 'more', 'z']], 
      dtype='|S10')

おそらくあなたが望むのは:

In [19]: without_column = real_array1[:,1:]

In [20]: without_column
Out[20]: 
array([['a,b,c,9', 'more', 'b,c,4'],
       ['1', 'more', 'z'],
       ['z', 'more', '9,1'],
       ['4,3', 'more', '1,a']], 
      dtype='|S10')

これは意図したものですか?


あなたのコードを実行しようとすると、size> 1 を選択すると while ループが永遠に実行されます。

于 2013-04-23T15:53:58.560 に答える
-1

両方の配列が同一ではありません。非作業配列は多次元配列であり、標準配列ではありません。

于 2013-04-23T15:07:55.560 に答える