Rocksolid Light

News from da outaworlds

mail  files  register  groups  login

Message-ID:  

BOFH excuse #444: overflow error in /dev/null


comp / comp.lang.python / RE: Relatively prime integers in NumPy

SubjectAuthor
o RE: Relatively prime integers in NumPy<avi.e.gross

1
Subject: RE: Relatively prime integers in NumPy
From: <avi.e.gross@gmail.com>
Newsgroups: comp.lang.python
Date: Sat, 13 Jul 2024 04:46 UTC
References: 1 2 3 4 5 6 7
Path: eternal-september.org!news.eternal-september.org!feeder3.eternal-september.org!fu-berlin.de!uni-berlin.de!not-for-mail
From: <avi.e.gross@gmail.com>
Newsgroups: comp.lang.python
Subject: RE: Relatively prime integers in NumPy
Date: Sat, 13 Jul 2024 00:46:55 -0400
Lines: 598
Message-ID: <mailman.38.1720846018.2981.python-list@python.org>
References: <SA0PR09MB6363F3E6B493202E73869DF4DBDA2@SA0PR09MB6363.namprd09.prod.outlook.com>
<00e801dad3bf$473daed0$d5b90c70$@gmail.com>
<DM8PR09MB63603191F5509E5013D1BEDCDBA52@DM8PR09MB6360.namprd09.prod.outlook.com>
<DM8PR09MB636055F61171899BF14B01D3DBA62@DM8PR09MB6360.namprd09.prod.outlook.com>
<011801dad4b7$44a07100$cde15300$@gmail.com>
<DM8PR09MB6360AD8A1C512FAC31F32F70DBA72@DM8PR09MB6360.namprd09.prod.outlook.com>
<01ef01dad4df$aff92ff0$0feb8fd0$@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain;
charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Trace: news.uni-berlin.de ZxnPvHKRfftD/4I2Vtz5sgNq0D9bSW76a64AxnSfMkcw==
Cancel-Lock: sha1:rvhelq++Kq/GiLLePpaK8YhQuJc= sha256:3TFJef1SxKGkmFg20c2Ub/13RD1v6l+zB6FROvMFxvY=
Return-Path: <avi.e.gross@gmail.com>
X-Original-To: python-list@python.org
Delivered-To: python-list@mail.python.org
Authentication-Results: mail.python.org; dkim=pass
reason="2048-bit key; unprotected key"
header.d=gmail.com header.i=@gmail.com header.b=On2P0kLj;
dkim-adsp=pass; dkim-atps=neutral
X-Spam-Status: OK 0.003
X-Spam-Evidence: '*H*': 0.99; '*S*': 0.00; 'looks': 0.02; 'fairly':
0.05; '&gt;&gt;&gt;': 0.07; 'explanation': 0.07; 'loops.': 0.07;
'matches': 0.07; 'modules': 0.07; 'enough.': 0.09; 'indeed.':
0.09; 'mechanism': 0.09; 'much,': 0.09; 'numpy': 0.09; 'routine':
0.09; 'search,': 0.09; 'skip:z 20': 0.09; 'url-
ip:13.107.246.67/32': 0.09; 'url-ip:13.107.246/24': 0.09; '&gt;':
0.14; 'import': 0.15; 'url:mailman': 0.15; '(1,': 0.16; '1),':
0.16; '2024': 0.16; '3:10': 0.16; 'benchmarking': 0.16;
'divisors': 0.16; 'examples.': 0.16; 'far,': 0.16; 'interpreted.':
0.16; 'itertools': 0.16; 'loops': 0.16; 'modules,': 0.16;
'numpy,': 0.16; 'numpy.': 0.16; 'numpy?': 0.16; 'patterns.': 0.16;
'prime': 0.16; 'procedure': 0.16; 'prompts': 0.16; 'received:mail-
qv1-xf2e.google.com': 0.16; 'relatively': 0.16; 'skip:0 210':
0.16; 'somewhat': 0.16; 'sorry.': 0.16; 'step.': 0.16; 'tuples':
0.16; 'url-ip:3.215/16': 0.16; 'url:urldefense': 0.16; 'url:v3':
0.16; 'using.': 0.16; 'python': 0.16; 'code.': 0.17; 'message-
id:@gmail.com': 0.18; 'solve': 0.19; 'implement': 0.19; 'to:addr
:python-list': 0.20; 'issue': 0.21; 'written': 0.22; 'languages':
0.22; 'i.e.': 0.22; 'maybe': 0.22; 'version': 0.23; 'code': 0.23;
'(and': 0.25; 'skip:- 10': 0.25; 'depends': 0.25; 'url:listinfo':
0.25; 'cannot': 0.25; 'programming': 0.25; '11,': 0.26; 'friday,':
0.26; 'else': 0.27; 'bit': 0.27; 'function': 0.27; 'done': 0.28;
'>>>': 0.28; 'expect': 0.28; 'mostly': 0.28; 'purpose': 0.28;
'email addr:python.org&gt;': 0.28; 'example,': 0.28; 'suggest':
0.28; 'module': 0.31; 'think': 0.32; 'question': 0.32; '(as':
0.32; 'carefully': 0.32; 'collected': 0.32; 'needed,': 0.32;
'python-list': 0.32; 'structure': 0.32; 'develop': 0.32; 'but':
0.32; "i'm": 0.33; 'there': 0.33; 'particular': 0.33; 'numbers':
0.67; 'skip:n 30': 0.67; 'back': 0.67; 'outside': 0.67; 'url-
ip:104.18/16': 0.67; 'url-ip:18/8': 0.67; 'url-ip:3/8': 0.67;
'8bit%:69': 0.69; '8bit%:91': 0.69; '8bit%:96': 0.69; '8bit%:99':
0.69; 'candidate': 0.69; 'compare': 0.69; 'enclosed': 0.69;
'factor': 0.69; 'functional': 0.69; 'latter': 0.69; 'skip:\xe2
20': 0.69; 'url:us': 0.69; 'within': 0.69; '8bit%:43': 0.70;
'interesting': 0.71; 'speed': 0.71; 'skip:\xe2 10': 0.71;
'8bit%:89': 0.75; '8bit%:92': 0.75; '8bit%:94': 0.75; '8bit%:78':
0.76; 'combination': 0.76; 'factors': 0.76; 'languages,': 0.76;
'sent:': 0.78; 'highly': 0.78; '0in': 0.81; '8bit%:95': 0.84;
'reasons': 0.84; '8bit%:76': 0.84; '8bit%:97': 0.84; 'atd': 0.84;
'axis': 0.84; 'combinations': 0.84; 'email name:&lt;python-list':
0.84; 'indices': 0.84; 'lot.': 0.84; 'popov': 0.84; 'skip:& 50':
0.84; 'skip:1 70': 0.84; 'url:--': 0.84; '8bit%:98': 0.91;
'expensive': 0.91; 'skip:\xd0 10': 0.91; 'aspects': 0.93;
'interest.': 0.93; 'hidden': 0.95
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20230601; t=1720846015; x=1721450815; darn=python.org;
h=thread-index:content-language:mime-version:message-id:date:subject
:in-reply-to:references:to:from:from:to:cc:subject:date:message-id
:reply-to; bh=fAEm6aatoSX1rIXfZ2f867FjgAv63Il5EGAx9SzelSE=;
b=On2P0kLjtTMe5exTZmU+2rsR0cHxw3urmolJmsW4yY7TFqGvJOfYOjDOdd9yL4YV/A
3Sa4l9ObHzzV4a08OhgUCfyZjvqxArT4aE71Tm4FoIT2TBVzO2b8FSeI9wSyR14HbhI5
PeFZnXz1r6Nnhi3pErBCjGvDYGWHaGdseXld/Mk0iLG2qNzr9CJdzjJftqktkTIi9agA
K2D4vMYQKUSBCypk8Y43UT+l0g2pY7V1vYQwLp/DFM0b4fEGeNOYDXeE8MGXghBPE0WS
lL4p2mQGACroeNUhQYoo1VKIulqDEifDlirZ2kXFhBpzVe5AShMSPCAFDwYROHkXv4S3
wbug==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20230601; t=1720846015; x=1721450815;
h=thread-index:content-language:mime-version:message-id:date:subject
:in-reply-to:references:to:from:x-gm-message-state:from:to:cc
:subject:date:message-id:reply-to;
bh=fAEm6aatoSX1rIXfZ2f867FjgAv63Il5EGAx9SzelSE=;
b=P9SxkFyoSKMSGiEfAGVdaSgaojq2AmjDcHDOSojivHp2Ug2UnUbM+Hhsgh5TD9jPYC
tH9gw3xZrh8CXhjfh3MHF8os1X7fwE9BtZEnbUSjJgAba6yr4O4rhkbdZzEjFn1tJU2U
ENPXfKg29Bs5mNy1HDZyh6YOTP7i3eG6xbDy47P/2NxVXGllSjQ2zdEsFsFzUs9ucgJ+
Ub9m2tIFcuDAwKgwQaox01FJjHKfQKdCGbNNvbqNCsscpFMF+WfFB0HuOZBoWCdEOeTP
8yUZwbv3G9g7PcbsQ/fh0ZKdX5BipP97jWSNU2j8p2AcIpCbcNyttyjrkE3jMFFgGLW4
I/7w==
X-Forwarded-Encrypted: i=1;
AJvYcCVTaK3chMxPAAeCcoKGJll0sWCLyKjtWCgT3iwDABYJNRA900CO/SHGf5LapT4liSJr23Moe+xQ8vSPVrCpBTm4V0fZNU62
X-Gm-Message-State: AOJu0YxtaEG3wZBK1anYPSkFlVeb1pCmPYFHRMk6hPaNTDunUn6X/KbM
ndnr2m1UATDOkZeBtrqhnpfwkiTiyIjedWafbtibAHxT2d1yGbKc
X-Google-Smtp-Source: AGHT+IEkqVESFTLUVLCTppMNlzDnHf14hptJUcenecrUIbyaSQ5rOM7X4Cm8/QRRHv11W7OodX2iHg==
X-Received: by 2002:a05:6214:2581:b0:6b1:e371:99d9 with SMTP id
6a1803df08f44-6b61bc7e7ddmr197253846d6.8.1720846014657;
Fri, 12 Jul 2024 21:46:54 -0700 (PDT)
In-Reply-To: <DM8PR09MB6360AD8A1C512FAC31F32F70DBA72@DM8PR09MB6360.namprd09.prod.outlook.com>
X-Mailer: Microsoft Outlook 16.0
Content-Language: en-us
Thread-Index: AQHaqdYQj6Isi+wDzs9EemRqPkPTEQJmM6ydAUtEEooBr5vKQQKMAsT/Aml9nvCxoa0LoA==
X-Content-Filtered-By: Mailman/MimeDel 2.1.39
X-BeenThere: python-list@python.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: General discussion list for the Python programming language
<python-list.python.org>
List-Unsubscribe: <https://mail.python.org/mailman/options/python-list>,
<mailto:python-list-request@python.org?subject=unsubscribe>
List-Archive: <https://mail.python.org/pipermail/python-list/>
List-Post: <mailto:python-list@python.org>
List-Help: <mailto:python-list-request@python.org?subject=help>
List-Subscribe: <https://mail.python.org/mailman/listinfo/python-list>,
<mailto:python-list-request@python.org?subject=subscribe>
X-Mailman-Original-Message-ID: <01ef01dad4df$aff92ff0$0feb8fd0$@gmail.com>
X-Mailman-Original-References: <SA0PR09MB6363F3E6B493202E73869DF4DBDA2@SA0PR09MB6363.namprd09.prod.outlook.com>
<00e801dad3bf$473daed0$d5b90c70$@gmail.com>
<DM8PR09MB63603191F5509E5013D1BEDCDBA52@DM8PR09MB6360.namprd09.prod.outlook.com>
<DM8PR09MB636055F61171899BF14B01D3DBA62@DM8PR09MB6360.namprd09.prod.outlook.com>
<011801dad4b7$44a07100$cde15300$@gmail.com>
<DM8PR09MB6360AD8A1C512FAC31F32F70DBA72@DM8PR09MB6360.namprd09.prod.outlook.com>
View all headers

Dmitry,

Efficiency of several kinds is hotly debated and sometimes it depends a lot on what is done within loops.

Many suggest a mild speed up of some comprehensions over loops but the loops are not gone but somewhat hidden and perhaps some aspects are faster for having been written in C carefully and not interpreted.

Comprehensions (and there are other versions that generate dictionaries and tuples and sets) may also be sped up a bit for other reasons like your fairly expensive APPPEND that has to keep finding the end o f a growing list and is not done the same way in a comprehension.

If you do a search, you find many opinions including on using functional programming techniques such as map/reduce. There are also

Your particular case is interesting because it just makes all combination of three variables. Some languages, like R, have functions that do this for you, like expand.grd. Python has many modules, like itertools that do things including combinations but perhaps not designed for your case.

Here is a version of your scenario:

import itertools

a = range(3)

b = range(4)

c = range(5)

list(itertools.product(a,b,c))

The result comes as tuples but as you are moving the result into numpy, does it matter:

>>> list(itertools.product(a,b,c))

[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 2, 4), (0, 3, 0), (0, 3, 1), (0, 3, 2), (0, 3, 3), (0, 3, 4), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 0, 4), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 0), (1, 3, 1), (1, 3, 2), (1, 3, 3), (1, 3, 4), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 0, 4), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 1, 4), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 0), (2, 3, 1), (2, 3, 2), (2, 3, 3), (2, 3, 4)]

Or a atd easier to read pretty printed:

>>> import pprint

>>> pprint.pprint(list(itertools.product(a,b,c)))

[(0, 0, 0),

(0, 0, 1),

(0, 0, 2),

(0, 0, 3),

(0, 0, 4),

(0, 1, 0),

(0, 1, 1),

(0, 1, 2),

(0, 1, 3),

(0, 1, 4),

(0, 2, 0),

(0, 2, 1),

(0, 2, 2),

(0, 2, 3),

(0, 2, 4),

(0, 3, 0),

(0, 3, 1),

(0, 3, 2),

(0, 3, 3),

(0, 3, 4),

(1, 0, 0),

(1, 0, 1),

(1, 0, 2),

(1, 0, 3),

(1, 0, 4),

(1, 1, 0),

(1, 1, 1),

(1, 1, 2),

(1, 1, 3),

(1, 1, 4),

(1, 2, 0),

(1, 2, 1),

(1, 2, 2),

(1, 2, 3),

(1, 2, 4),

(1, 3, 0),

(1, 3, 1),

(1, 3, 2),

(1, 3, 3),

(1, 3, 4),

(2, 0, 0),

(2, 0, 1),

(2, 0, 2),

(2, 0, 3),

(2, 0, 4),

(2, 1, 0),

(2, 1, 1),

(2, 1, 2),

(2, 1, 3),

(2, 1, 4),

(2, 2, 0),

(2, 2, 1),

(2, 2, 2),

(2, 2, 3),

(2, 2, 4),

(2, 3, 0),

(2, 3, 1),

(2, 3, 2),

(2, 3, 3),

(2, 3, 4)]

I think that is close enough to what you want but is it faster? You can try a benchmarking method on alternatives.

From: Popov, Dmitry Yu <dpopov@anl.gov>
Sent: Friday, July 12, 2024 11:10 PM
To: avi.e.gross@gmail.com; 'Popov, Dmitry Yu via Python-list' <python-list@python.org>; oscar.j.benjamin@gmail.com
Subject: Re: Relatively prime integers in NumPy

Thank you very much. List comprehensions make code much more concise indeed. Do list comprehensions also improve the speed of calculations?

_____

From: avi.e.gross@gmail.com <mailto:avi.e.gross@gmail.com> <avi.e.gross@gmail.com <mailto:avi.e.gross@gmail.com> >
Sent: Friday, July 12, 2024 6:57 PM
To: Popov, Dmitry Yu <dpopov@anl.gov <mailto:dpopov@anl.gov> >; 'Popov, Dmitry Yu via Python-list' <python-list@python.org <mailto:python-list@python.org> >; oscar.j.benjamin@gmail.com <mailto:oscar.j.benjamin@gmail.com> <oscar.j.benjamin@gmail.com <mailto:oscar.j.benjamin@gmail.com> >
Subject: RE: Relatively prime integers in NumPy

Dmitry, I clearly did not understand what you wanted earlier as you had not made clear that in your example, you already had progressed to some level where you had the data and were now doing a second step. So, I hesitate to say much until

ZjQcmQRYFpfptBannerStart

This Message Is From an External Sender

This message came from outside your organization.

ZjQcmQRYFpfptBannerEnd

Dmitry,

I clearly did not understand what you wanted earlier as you had not made clear that in your example, you already had progressed to some level where you had the data and were now doing a second step. So, I hesitate to say much until either nobody else addressed the issue (as clearly some have) or you explain well enough.

Ditr

I am guessing you have programming experience in other languages and are not as “pythonic” as some. The code you show may not be quite how others might do it. Some may write mch of your code as a single line of python using a list comprehension such as:

hkl_list = [ [h, k, l] for SOMETHING in RANGE for SOMETHING2 in RANGE2 for SOMETHING3 in RANGE3]

Where h, k. l come from the somethings.

Back to the real world.

From: Popov, Dmitry Yu <dpopov@anl.gov <mailto:dpopov@anl.gov> >
Sent: Friday, July 12, 2024 1:13 PM
To: avi.e.gross@gmail.com <mailto:avi.e.gross@gmail.com> ; 'Popov, Dmitry Yu via Python-list' <python-list@python.org <mailto:python-list@python.org> >; oscar.j.benjamin@gmail.com <mailto:oscar.j.benjamin@gmail.com> ; Popov, Dmitry Yu <dpopov@anl.gov <mailto:dpopov@anl.gov> >
Subject: Re: Relatively prime integers in NumPy

Thank you very much, Oscar.

Using the following code looks like a much better solution than my current Python code indeed.

np.gcd.reduce(np.transpose(a))
or
np.gcd.reduce(a,1)
The next question is how I can generate ndarray of h,k,l indices. This can be easily done from a Python list by using the following code.
import numpy as np
hkl_list=[]
for h in range(0, max_h):
      for k in range(0, max_k):
            for l in range(0, max_l):
                  hkl_local=[]
                  hkl_local.append(h)
                  hkl_local.append(k)
                  hkl_local.append(l)
                  hkl_list.append(hkl_local)
hkl=np.array(hkl_list, dtype=np.int64)
This code will generate a two-dimensional ndarray of h,k,l indices but is it possible to make a faster routine with NumPy?
Regards,
Dmitry

_____

From: Python-list <python-list-bounces+dpopov=anl.gov@python.org <mailto:python-list-bounces+dpopov=anl.gov@python.org> > on behalf of Popov, Dmitry Yu via Python-list <python-list@python.org <mailto:python-list@python.org> >
Sent: Thursday, July 11, 2024 2:25 PM
To: avi.e.gross@gmail.com <mailto:avi.e.gross@gmail.com> <avi.e.gross@gmail.com <mailto:avi.e.gross@gmail.com> >; 'Popov, Dmitry Yu via Python-list' <python-list@python.org <mailto:python-list@python.org> >
Subject: Re: Relatively prime integers in NumPy

Thank you for your interest. My explanation is too concise indeed, sorry. So far, I have used Python code with three enclosed 'for' loops for this purpose which is pretty time consuming. I'm trying to develop a NumPy based code to make this

ZjQcmQRYFpfptBannerStart

This Message Is From an External Sender

This message came from outside your organization.

ZjQcmQRYFpfptBannerEnd

Thank you for your interest. My explanation is too concise indeed, sorry. So far, I have used Python code with three enclosed 'for' loops for this purpose which is pretty time consuming. I'm trying to develop a NumPy based code to make this procedure faster. This routine is kind of 'heart' of the algorithm to index of X-ray Laue diffraction patterns. In our group we have to process huge amount of such patterns. They are collected at a synchrotron radiation facility. Faster indexation routine would help a lot.
This is the code I'm currently using. Any prompts how to implement it in NumPy would be highly appreciated.
for h in range(0, max_h):
      for k in range(0, max_k):
            for l in range(0, max_l):
                  chvec=1
                  maxmult=2
                  if h > 1:                     
                        maxmult=h
                  if k > 1:
                        maxmult=k
                  if l > 1:
                        maxmult=l
                  if h > 1:
                        if maxmult > h:
                              maxmult=h
                  if k > 1:
                        if maxmult > k:
                              maxmult=k
                  if l > 1:
                        if maxmult > l:
                              maxmult=l
                  maxmult=maxmult+1
                  for innen in range(2, maxmult):
                        if h in range(0, (max_h+1), innen):
                              if k in range(0, (max_k+1), innen):
                                    if l in range(0, (max_l+1), innen):
                                          chvec=0
                  if chvec==1:
                        # Only relatively prime integers h,k,l pass to this block of the code

Click here to read the complete article

1

rocksolid light 0.9.8
clearnet tor