>source

나는 대각선을 가로 질러 대칭 인 크고 스파 스 인접 매트릭스 (64948 x 64948)를 가지고 있습니다. 내가해야 할 일은 매트릭스의 상단 또는 하한 삼각형의 아픈 요소의 위치를 ​​무작위로 지정하는 것입니다 (그러면 전치를 취할 것입니다.) 나는 아래 에서이 저의 code를 가지고 있습니다. 10x10 매트릭스에서 작동하지만 64948x64948은 아닙니다 (클러스터에서 메모리 오류가 발생 함). 나는 내 방법이 결함이있을 수 있음을 깨닫고, 누구든지 내가 더 효율적인 방법으로 이것을 어떻게 할 수 있는지에 대한 통찰력이 있는지 고맙게 생각합니다!

첫째, 나는 근본적으로 하부 삼각형의 모든 위치의 배열 인 "마스크"를 만듭니다.

mask_mtx= np.ones([10,10]) #all ones
mask_mtx= np.tril(mask_mtx,-1) #lower triangle ones
mask_mtx= sparse.csr_matrix(mask_mtx)
mask= sparse.find(mask_mtx) #indices of ones
np.save('struc_conn_mat_mask.npy',mask) #cluster fails here when n=64948. I'm trying to save it out from a cluster so I can use the mask on my local machine with code below
len_mask= len(mask[0]) #how many indices there are

i 예제의 목적을 위해 배열로 MTX를 생성하지만 일반적으로 65k x 65k csr_matrix에서 읽을 것입니다. 그런 다음 MTX 하위 삼각형의 0이 아닌 요소의 수를 찾아서 마스크에서 많은 위치를 무작위로 선택합니다. 그런 다음 비어있는 TMP_MTX 에이 위치에 1을 넣습니다. 마지막으로, 아래쪽 삼각형을 위쪽 삼각형으로 조옮습니다.

mtx= sparse.random(10,10,format='csr',density=0.1) #for the purposes of this example, create random matrix
lmtx= sparse.tril(mtx,-1,format='csr') #lower triangle
tmp_mtx= np.zeros((10,10)) #empty lower triangle to set
lvals= sparse.csr_matrix.count_nonzero(lmtx) #how many 1s in lmtx?
coordinate_indices= random.sample(range(len_mask),lvals) #choose n=lvals random indices to fill with ones
for idx in coordinate_indices:
    tmp_mtx[mask[0][idx]][mask[1][idx]]= 1 #at randomly chosen index from mask, put a 1
tmp_mtx= sparse.csr_matrix(tmp_mtx)
mtx= tmp_mtx + tmp_mtx.T #transpose to upper triangle

다시는 10x10 매트릭스로 잘 작동하지만 더 큰 행렬이있는 여러 곳에서 실패합니다. 궁극적으로, 내가하고 싶은 것은 겉으로보기에 간단한 조작이며 삼각형을 섞는다. 그러나 나는 더 효율적인 방법으로 그것을하는 방법을 생각할 수 없다. 아마도 컬럼과 행을 셔플하는 방법이 있습니다 (그러나 삼각형 중 하나만에 대해서는 단지?)

도움이 될 것입니다. 그래서 그래서 평가를 받았습니다! 감사합니다.

이것은 제목 (또는 아마 다른 누군가)의 종류가 내 머리에서 실행될 수있는 종류의 일종이 아닙니다. 그래서 내가 도울 수있는 유일한 방법은 내 컴퓨터에서 code를 다시 만들고 중간 단계를 살펴 보는 것입니다. 그러나 그것이 더 작은 크기로 실행되는 것은 아니지만 불특정 더 큰 모양으로 불특정적인 방법으로 실패합니다. 그것은 테스트 할 초대적인 일이 아닙니다. 셔플 링 및 인덱싱은 scipy가 아닙니다. 스크래스 강한 점입니다. 인덱싱을 위해 매트릭스 곱셈을 사용하여 종종 끝납니다.

hpaulj2021-05-12 07:07:08

0.1 밀도의 경우에도 스파 스 매트릭스는 4 억 2 천만 개의 항목을 가지며, 여러 기가 바이트의 메모리를 가져갈 것입니다. 숫자에 대해서는 3.2GB, 스파 스 좌표 및 링크를 저장하는 오버 헤드입니다. 당신은 당신의 문제에 대해 다른 방식으로 생각해야 할 수도 있습니다.

Tim Roberts2021-05-12 07:07:08

귀하의 통찰력에 감사드립니다. 뇌 연결을 나타내는 것은 확실히 데이터 문제입니다. 새로운 것을 알아낼 경우 게시물을 업데이트 할 것입니다.

Brian Winston2021-05-12 07:07:08

tril 대신 tril_indices를 들여 스파 스 공간에서 일하십시오. 배포가 균일 한 경우 블록으로 분할됩니다

Mad Physicist2021-05-12 07:07:08
  • 이전 Java Spring Boot에서 효과적인 몇 가지 작업을 실행하는 방법
  • 다음 Running 동안 SQL Throwing 오류를위한 PowerShell code