Python da qator qiymatiga bog'liq bo'lgan qatorlarni ajratish

Bu kabi koordinatalar qatori bor:

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]]

Qatorni 6 o'rtasida bo'lishini xohlayman. va 7 . X qiymatida bo'sh joy mavjud bo'lgani uchun ([5,7], [18,6]) kodini koordinatsiya qilish kerak. arr1 split va arr2 dan oldin qadriyatlar bo'lgan arr1 va arr2 ikkita alohida qatorni olishni xohlayman keyin qadriyatlar.

Agar keyingi X qiymati 10 farqidan kattaroq bo'lsa, u arr2 ga qo'shiladi, yoki arr1 , shunday bir narsa:

arr1 = []
arr2 = []
for [x,y] in array: 
    if next(x) > 10:
        arr2.append(x,y)
    else:
        arr1.append(x,y)

Kimdir bu muammoni hal qilishga yordam berishi mumkinmi?

4
> 10: - bu qattiq kodlangan urinishdir, keyin 10 raqamli emas, faqat uzluksizlikda bo'linish kerakmi? [5,6], [5,7] haqida nima deyish mumkin, bu ham e'tiborga olinmaydi?
qo'shib qo'ydi muallif roganjosh, manba
Aslida bu menga nima uchun bu misol kiritishda faqat ikkita massivga olib kelishi aniq emas, bo'linma tasodifiy ko'rinadi.
qo'shib qo'ydi muallif roganjosh, manba
Bundan tashqari, qo'shimchalaringiz arr1.append ([x, y])) kabi ko'rinishi kerak, asl ro'yxatiga muvofiq bo'lishi kerak
qo'shib qo'ydi muallif Priyank, manba
Faqat birinchi farq 10dan kattagina indeks asosida bo'linish kerakmi?
qo'shib qo'ydi muallif Rohan Sadale, manba
Bu buyurtma yoki buyurtmaga ko'ra, birinchi eng katta sakrash muhim emasmi?
qo'shib qo'ydi muallif Rohan Sadale, manba
10 - bu kodi bilan ishlashga urinishdir, agar yaxshi usul bo'lsa, iltimos menga xabar bering;) Jadvalning o'lchami o'zgarishi mumkin, lekin x qiymatini bir joyga qo'ying va bu erda qatorni bo'lishni istayman.
qo'shib qo'ydi muallif agrom, manba

7 javoblar

Agar sizning savolingizga to'g'ri javob bersangiz, siz keyingi ikki x-qiymat orasidagi farq 10 dan katta bo'lgan birinchi nuqtada qatorni ajratishga harakat qilyapsiz. Buni numpy dan foydalanib qilishingiz mumkin:

import numpy as np
THRESH = 10
array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]]
array = np.asarray(array)
deltas_x = np.abs(array[1:,0] - array[:-1,0])
split_idx = np.where(deltas_x > THRESH)[0][0] + 1
arr1 = array[:split_idx,:]
arr2 = array[split_idx:,:]

Note that we need to add 1 to the result of np.where to account for the fact that the deltas_x array is 1 value shorter than array

2
qo'shib qo'ydi

Bu sizning izlayotgan narsangiz bo'lishi mumkin

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]]
# Declare two array variables
arr1 = None
arr2 = None
n = len(array)
for i in range(n-1): 
    if abs(array[i][0] - array[i+1][0]) >= 10:
       arr1 = array[:i+1]
       arr2 = array[i+1:]
       break

print arr1
print arr2
2
qo'shib qo'ydi
uchun oralig'i qatoridagi elementlar soniga bog'liq ekan, diapazoni xato dan qaytishi kerak. Agar siz Y qiymatlari bilan ishlamoqchi bo'lsangiz, loop uchun ichki yozishingiz mumkin.
qo'shib qo'ydi muallif Rohan Sadale, manba
Y qiymati bo'yicha qanday qilib buni amalga oshiradi? abs {array [0] [i] - array [if] [0] - array [i + 1] [0])> = 10: 0] [i + 1])> = 10: faqat bir IndexError: ro'yxat indekslarini
qo'shib qo'ydi muallif agrom, manba

Siz quyidagilarni amalga oshirishingiz mumkin:

ar = np.array([[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]])

# get differences of x values
dif = ar[1:, 0] - ar[:-1, 0]

# get the index where you first observe a jump
fi = np.where(abs(dif) > 10)[0][0]

ar1 = ar[:fi+1]
ar2 = ar[fi+1:]

Keyin dif quyidagicha bo'ladi:

array([ 1,  1,  1,  1,  0, 13,  1, -2, -7])

fi would be 5 vaar1 vaar2 would be:

array([[ 1,  6],
       [ 2,  6],
       [ 3,  8],
       [ 4, 10],
       [ 5,  6],
       [ 5,  7]])

va

array([[18,  6],
       [19,  5],
       [17,  9],
       [10,  5]]),

navbati bilan.

That would also allow you to get all jumps in your data (you would just have to change fi = np.where(abs(dif) > 10)[0][0] to fi = np.where(abs(dif) > 10)[0])

1
qo'shib qo'ydi

Ehtimol, ketma-ket juftliklar ustidan yineleme va bo'sh joy topilmaguncha bo'linish oson:

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]]

for idx, (cur, nxt) in enumerate(zip(array, array[1:])):  # successive pairs and index
    if abs(cur[0] - nxt[0]) > 10:  # compare difference of first items
        arr1, arr2 = array[:idx+1], array[idx+1:]  # split
        break  # no further splits, end the loop now
else:  # no break, keep the original array
    arr1, arr2 = array, []

Qaysi narsa beradi:

>>> arr1
[[1, 6], [2, 6], [3, 8], [4, 10], [5, 6], [5, 7]]
>>> arr2
[[18, 6], [19, 5], [17, 9], [10, 5]]

Agar siz bir necha marta bo'linishni xohlasangiz, bu sizning holatlaringizda yaxshi bo'lishi kerak.

1
qo'shib qo'ydi

Buni ko'ring:

prev = array[0][0]
pos = -1
for i in range (1, len(array)):
if array[i][0] - prev >1:
break
else:
prev = array[i][0]
if pos != -1:
arr1 = array[:pos]
arr2 = array[pos:]

Bu array siz xohlagan shaklda bo'linishi kerak. Ro'yxat 0 dan indekslanganligiga e'tibor bering.

1
qo'shib qo'ydi
Bu x qiymatlari doimiy bo'lmagan qatorda birinchi o'rinni topish kerak. Rahmat! @Rohan Sadale
qo'shib qo'ydi muallif Priyank, manba
Bu javob emas.
qo'shib qo'ydi muallif Rohan Sadale, manba
Javobingiz uchun tashakkur! Qatorning kattaligi o'zgarishi mumkinligini aytib o'tishim kerak edi, lekin har doim X qiymatida bo'sh joy bo'ladi. Shuning uchun X usuliga bog'liq bo'lgan usulni ajratishni xohlayman.
qo'shib qo'ydi muallif agrom, manba

Men ketma-ketlikdagi elementlarni taqqoslayotganda odatda numaralandırmanı foydalaning:

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]]
arr1 = list()
arr2 = list()
gap = 10

for index, value in enumerate(array[:-1]): # [:-1] prevents out of range
    if abs(value[0]-array[index+1][0]) >= gap:
        arr1.append(value)
    else:
        arr2.append(value)

arr2.append(array[-1])  # Take into account that the last element needs to be added to one of the arrays.
1
qo'shib qo'ydi
arry1 = []
arry2 = []
for i in arry:
    if (i[0] - i[1]) > 10:
        arry1.append(i)
    else:
        arry2.append(i)
0
qo'shib qo'ydi
Ushbu kod javobga javob berishi mumkin bo'lsa-da, savolning qanday va/yoki nima sababdan hal qilinayotganiga doir qo'shimcha kontekstni berish javobning uzoq muddatli qiymatini yaxshilashga olib keladi.
qo'shib qo'ydi muallif Donald Duck, manba
Fikrdan foydalaning, javob bermang
qo'shib qo'ydi muallif Dmitry, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming