前提・実現したいこと
[[0 1 3 3 0]
[1 0 3 0 0]
[1 0 3 3 0]
[1 3 3 0 0]
[1 3 0 0 0]]
というnparrayの配列についてです。1つ目([1 0 3 0 0])の0のいずれか1箇所に3を追加すると2つ目([1 0 3 3 0])、3つ目([1 3 3 0 0])になります。なので、[2 3 0]と出力させたいです。それを0つ目から4つ目まで全て行い、それをまた別のnparrayの配列に出力させたいです。つまり、
[[0 0 0]
[2 3 0]
[0 0 0]
[0 0 0]
[3 0 0]]
という配列を出力させたいです。
以下のコードで実現はできるのですが、速度があまり早くありません。実際はこの配列の要素はもっと多いのであまり時間がかかりすぎると少々不都合がありまして。。
書いたコード(print抜)
Python
1import numpy as np 2lst = np.array([[0,1,3,3,0],[1,0,3,0,0],[1,0,3,3,0],[1,3,3,0,0],[1,3,0,0,0]])#質問の一番上に書いてる配列と同じ 3lst2 = np.zeros((10,3))#後に、質問の上から二番目に書いてる配列と同じになる 4for i in range(len(lst)):#0つ目から試す(3にする前のもの) 5 lst2_temp = [] 6 for j in range(len(lst)):#0つ目から試す(3にした後のもの) 7 if int(np.count_nonzero(lst[j] > 0)) - int(np.count_nonzero(lst[i] > 0)) == 1:#それらの配列の0の数が一つ違う = 3が一つ増えた 8 if np.count_nonzero(np.logical_and(lst[j]-lst[i] != 3, lst[j]-lst[i] != 0)) == 0:#それらの配列の差をとったときに、3でも0でもないところがない = 3が一つ増えた以外の変化はない 9 lst2_temp.append(j) #3にしたあとのものの番号を記録する 10 for j in range(len(lst2[0])-len(lst2_temp)):#リストの長さを3に調整するためのもの 11 lst2_temp.append(0) 12 lst2[i] = np.array(lst2_temp)#これで、質問の上から二番目に書いてる配列と同じになる
書いたコード(print込)
Python
1import numpy as np 2lst = np.array([[0,1,3,3,0],[1,0,3,0,0],[1,0,3,3,0],[1,3,3,0,0],[1,3,0,0,0]])#質問の一番上に書いてる配列と同じ 3lst2 = np.zeros((10,3))#後に、質問の上から二番目に書いてる配列と同じになる 4print(lst) 5for i in range(len(lst)):#0つ目から試す(3にする前のもの) 6 lst2_temp = [] 7 print() 8 print("i:",lst[i]) 9 for j in range(len(lst)):#0つ目から試す(3にした後のもの) 10 print("j:",lst[j]) 11 print("i_num:",np.count_nonzero(lst[i] > 0)) 12 print("j_num:",np.count_nonzero(lst[j] > 0)) 13 if int(np.count_nonzero(lst[j] > 0)) - int(np.count_nonzero(lst[i] > 0)) == 1:#それらの配列の0の数が一つ違う = 3が一つ増えた 14 print(lst[j]-lst[i]) 15 if np.count_nonzero(np.logical_and(lst[j]-lst[i] != 3, lst[j]-lst[i] != 0)) == 0:#それらの配列の差をとったときに、3でも0でもないところがない = 3が一つ増えた以外の変化はない 16 print(j) 17 lst2_temp.append(j)#3にしたあとのものの番号を記録する 18 for j in range(len(lst2[0])-len(lst2_temp)):#リストの長さを3に調整するためのもの 19 lst2_temp.append(0) 20 print("lst2_temp:",lst2_temp) 21 lst2[i] = np.array(lst2_temp)#これで、質問の上から二番目に書いてる配列と同じになる 22print(lst2)
出力されたもの
[[0 1 3 3 0] [1 0 3 0 0] [1 0 3 3 0] [1 3 3 0 0] [1 3 0 0 0]] i: [0 1 3 3 0] j: [0 1 3 3 0] i_num: 3 j_num: 3 j: [1 0 3 0 0] i_num: 3 j_num: 2 j: [1 0 3 3 0] i_num: 3 j_num: 3 j: [1 3 3 0 0] i_num: 3 j_num: 3 j: [1 3 0 0 0] i_num: 3 j_num: 2 lst2_temp: [0, 0, 0] i: [1 0 3 0 0] j: [0 1 3 3 0] i_num: 2 j_num: 3 [-1 1 0 3 0] j: [1 0 3 0 0] i_num: 2 j_num: 2 j: [1 0 3 3 0] i_num: 2 j_num: 3 [0 0 0 3 0] 2 j: [1 3 3 0 0] i_num: 2 j_num: 3 [0 3 0 0 0] 3 j: [1 3 0 0 0] i_num: 2 j_num: 2 lst2_temp: [2, 3, 0] i: [1 0 3 3 0] j: [0 1 3 3 0] i_num: 3 j_num: 3 j: [1 0 3 0 0] i_num: 3 j_num: 2 j: [1 0 3 3 0] i_num: 3 j_num: 3 j: [1 3 3 0 0] i_num: 3 j_num: 3 j: [1 3 0 0 0] i_num: 3 j_num: 2 lst2_temp: [0, 0, 0] i: [1 3 3 0 0] j: [0 1 3 3 0] i_num: 3 j_num: 3 j: [1 0 3 0 0] i_num: 3 j_num: 2 j: [1 0 3 3 0] i_num: 3 j_num: 3 j: [1 3 3 0 0] i_num: 3 j_num: 3 j: [1 3 0 0 0] i_num: 3 j_num: 2 lst2_temp: [0, 0, 0] i: [1 3 0 0 0] j: [0 1 3 3 0] i_num: 2 j_num: 3 [-1 -2 3 3 0] j: [1 0 3 0 0] i_num: 2 j_num: 2 j: [1 0 3 3 0] i_num: 2 j_num: 3 [ 0 -3 3 3 0] j: [1 3 3 0 0] i_num: 2 j_num: 3 [0 0 3 0 0] 3 j: [1 3 0 0 0] i_num: 2 j_num: 2 lst2_temp: [3, 0, 0] [[0. 0. 0.] [2. 3. 0.] [0. 0. 0.] [0. 0. 0.] [3. 0. 0.]]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。