apa arti 1 dalam array[] di Julia?

Saya berada dalam situasi di mana saya harus menulis ulang beberapa kode Julia ke dalam kode Python dan saya tidak dapat mereproduksi baris ini.

if 1 in array1[array2] || 1 in array1[array3]

Dalam pemahaman saya, baris ini membandingkan array array1 ke array2 dan array1 ke array3, untuk melihat apakah indeks array2 dari array1 adalah 1 atau indeks array3 dari array1 adalah 1.

Jadi, saya mereproduksi kode ini menjadi kode python dengan pemahaman saya,

for i, j in zip(array2, array3):
    if array1[i] == 1 or array1[j] == 1:

Tetapi kode ini tidak berfungsi seperti kode di atas dan saya mendapat ValueError seperti di bawah ini:

ValueError: Nilai kebenaran array dengan lebih dari satu elemen bersifat ambigu. Gunakan a.any() atau a.all()

Saya tidak yakin apakah ini kesalahpahaman saya terhadap baris Julia atau kode Python saya salah.

Bisakah seseorang memberi tahu saya apa yang salah?

[sunting]: Ini kode Julia untuk masalah ini. di sini saya menggunakan jaringan klub karate sebagai matriks masukan dir = to/your/path ln = soc-karate.mtx

mtx = MatrixMarketRead(string(dir,strip(ln)));
A = mtx - spdiagm(diag(mtx))
n = size(A,1);
A = speye(n) - A * spdiagm(1./vec(sum(A,1)));
println(A)
function findDegrees(Ac::SparseMatrixCSC)
  degrees = zeros(Int,length(Ac.colptr)-1)
    for i = 1:length(degrees)
      degrees[i] = Ac.colptr[i+1]-Ac.colptr[i]-1
    end
  return degrees
end

function lowDegreeNodes(A::SparseMatrixCSC,At::SparseMatrixCSC,d::Int64,dout::Vector,din::Vector)
  # 1: find low degree nodes
  n = size(A,1)
  U = collect(dout.==1)
  println(U)
  V = collect(din.==1)
  Z = min((dout+din) .>= 1 , (dout+din) .<= 8 )
  # 2:  visited = 0  ==> NotVisited
  #             = 1  ==> FNode
  #             = 2  ==> NotEliminated
  visited = zeros(length(U))
  
  for u = 1:n
    if Z[u]
      if visited[u] == 0
        Au = A.rowval[ A.colptr[u]:A.colptr[u+1]-1 ]
        Av = At.rowval[ At.colptr[u]:At.colptr[u+1]-1 ]
        if 1 in visited[Au] || 1 in visited[Av]
          visited[u] = 2
        else
          visited[Au] = 2
          visited[u] = 1
        end
      end
    end

    if V[u]
      if visited[u] == 0
        Au = A.rowval[ A.colptr[u]:A.colptr[u+1]-1 ]
        Av = At.rowval[ At.colptr[u]:At.colptr[u+1]-1 ]
        if 1 in visited[Au] || 1 in visited[Av]
          visited[u] = 2
        else
          visited[Av] = 2
          visited[u] = 1
        end
      end
    end

    if U[u]
      if visited[u] == 0
                Au = A.rowval[ A.colptr[u]:A.colptr[u+1]-1 ]

        Av = At.rowval[ At.colptr[u]:At.colptr[u+1]-1 ]
        if 1 in visited[Au] || 1 in visited[Av]
          visited[u] = 2
        else
          visited[Av] = 2
          visited[u] = 1
        end
      end
    end
  end
  return visited .== 1
end
dout = findDegrees(A)
din = findDegrees(A')
z = lowDegreeNodes(A, A', 3, dout, din)

person S.Ky    schedule 06.01.2021    source sumber
comment
sepertinya array Anda multidimensi... berikan contoh minimal yang dapat direproduksi.   -  person Julien    schedule 06.01.2021
comment
Alternatif untuk mengonversi adalah dengan memanggil Julia dari Python dengan pyJulia (atau sebaliknya dengan PyCall). Secara umum, Julia adalah bahasa yang jauh lebih berperforma, oleh karena itu mengonversi kode Anda ke Python mungkin merugikan dalam jangka panjang.   -  person lungben    schedule 06.01.2021
comment
@lungben kode Julia ini ditulis di Julia 0.5.2. akankah ini berfungsi dengan baik?   -  person S.Ky    schedule 07.01.2021
comment
Anda harus mencobanya. Julia 0.5 sudah cukup tua dan telah terjadi perubahan besar hingga Julia 1.0.   -  person lungben    schedule 07.01.2021


Jawaban (3)


if 1 in array1[array2] || 1 in array1[array3]

Dalam pemahaman saya, baris ini membandingkan array array1 ke array2 dan array1 ke array3, untuk melihat apakah indeks array2 dari array1 adalah 1 atau indeks array3 dari array1 adalah 1.

Menurutku itu tidak benar. Saya rasa baris ini menguji apakah 1 berada dalam nilai array1 pada indeks array2 atau indeks array3. Izinkan saya membuat MWE:

julia> array2 = [2, 3]
2-element Array{Int64,1}:
 2
 3

julia> array3 = [4, 5]
2-element Array{Int64,1}:
 4
 5

julia> array1 = [1, 9, 1, 2, 3]
5-element Array{Int64,1}:
 1
 9
 1
 2
 3

julia> 1 in array1[array2] || 1 in array1[array3]
true

julia> array1 = [1, 9, 4, 2, 3] # now only at the 1st position is there a 1
5-element Array{Int64,1}:
 1
 9
 4
 2
 3

julia> 1 in array1[array2] || 1 in array1[array3]
false
person Benoit Pasquier    schedule 06.01.2021
comment
Sebenarnya sintaks Julia hampir sama dengan Python di sini, Anda hanya perlu mengganti || oleh atau. - person lungben; 06.01.2021
comment
Python, berbeda dengan Julia, menggunakan pengindeksan berbasis 0 jadi kemungkinan besar Anda perlu mengurangi 1 dari array2 dan array3 - person Przemyslaw Szufel; 06.01.2021

Pemahaman Anda tentang baris ini benar:

Edit: Oke, setelah membaca kembali uraian Anda, saya kurang yakin pemahamannya benar, tapi semoga penjelasan ini bisa memperjelasnya.

if 1 in array1[array2] || 1 in array1[array3]

Anda memilih elemen di array1 pada indeks yang diberikan oleh array2 dan array3 dan memeriksa apakah salah satu elemen ini adalah 1

Jadi jika array1 Anda adalah [0, 1, 2, 3, 4, 5, 6] dan array2 adalah [1, 3, 4], array1[array2] akan menjadi [0, 2, 3] (ingat, array diindeks oleh 1 di Julia!) dan dengan demikian 1 in array1[array2] akan dievaluasi menjadi false

Anda dapat mencapai sesuatu yang serupa dengan numpy tetapi ingat bahwa karena indeks python sebesar 0, Anda harus mengurangi 1 dari indeks jika Anda ingin kode tetap setara untuk data masukan yang sama:

array1 = np.array([...]) # Fill your arrays with the data
array2 = np.array([...])
array3 = np.array([...])


if 1 in array1[array2 - 1] or 1 in array1[array3 - 1]:
    # Rest of code

Sintaks 1 in <array> sama seperti di Julia, dievaluasi menjadi True jika nilai 1 terkandung dalam <array>

person mandulaj    schedule 06.01.2021

Jika ini adalah daftar python biasa (dan dibuat dengan asumsi 0 array yang diindeks), Anda dapat melakukannya

array1 = [1,1,2,2,3,3]
array2 = [0,2]
array3 = [3,5]

print(any(array1[i]==1 for i in array2), any(array1[i]==1 for i in array3))

if any(array1[i]==1 for i in array2) or any(array1[i]==1 for i in array3):
    print("Yes")

Ini akan gagal jika indeks di dua larik kedua melebihi larik pertama. Dalam hal ini Anda bisa menggosoknya terlebih dahulu.

array2 = [i for i in array2 if i < len(array1)]
array3 = [i for i in array3 if i < len(array1)]
person tdelaney    schedule 06.01.2021
comment
Saya menjalankan print(any(array1[i] == 1 for I in array2)) dan mendapatkan kesalahan TypeError: only integer scalar arrays can be converted to a scalar index meskipun array2 memiliki elemen int di dalamnya. array2 memiliki [array([ 7, 12], dtype=int32)] untuk informasi Anda. - person S.Ky; 06.01.2021
comment
Saya menunjukkan cara kerjanya dengan daftar. Apakah kode persis ini cocok untuk Anda? Anda belum memberi tahu kami jenis array ini. Bisakah Anda memposting contoh yang berjalan sepenuhnya? Modul ekstensi Python seperti numpy dan pandas akan bekerja secara berbeda dari daftar int vanilla. Saya telah menunjukkan kepada Anda bagaimana melakukannya dengan tipe dasar ini. - person tdelaney; 06.01.2021