На основе this solution
для нахождения корреляционной матрицы между двумя 2D
массивами мы можем иметь аналогичный для нахождения корреляционный вектор, который вычисляет корреляцию между соответствующими строками в двух массивах. Реализация будет выглядеть примерно так:
def corr2_coeff_rowwise(A,B):
# Rowwise mean of input arrays & subtract from input arrays themeselves
A_mA = A - A.mean(1)[:,None]
B_mB = B - B.mean(1)[:,None]
# Sum of squares across rows
ssA = (A_mA**2).sum(1);
ssB = (B_mB**2).sum(1);
# Finally get corr coeff
return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)
Мы также можем оптимизировать часть, чтобы получить ssA
и ssB
, введя там магию einsum
!
def corr2_coeff_rowwise2(A,B):
A_mA = A - A.mean(1)[:,None]
B_mB = B - B.mean(1)[:,None]
ssA = np.einsum('ij,ij->i',A_mA,A_mA)
ssB = np.einsum('ij,ij->i',B_mB,B_mB)
return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)
Прогон образца -
In [164]: M1 = np.array ([
...: [1, 2, 3, 4],
...: [2, 3, 1, 4.5]
...: ])
...:
...: M2 = np.array ([
...: [10, 20, 33, 40],
...: [20, 35, 15, 40]
...: ])
...:
In [165]: corr2_coeff_rowwise(M1, M2)
Out[165]: array([ 0.99411402, 0.96131896])
In [166]: corr2_coeff_rowwise2(M1, M2)
Out[166]: array([ 0.99411402, 0.96131896])
Тест времени выполнения -
In [97]: M1 = np.random.rand(256,200)
...: M2 = np.random.rand(256,200)
...:
In [98]: out1 = np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
...: out2 = corr2_coeff_rowwise(M1, M2)
...: out3 = corr2_coeff_rowwise2(M1, M2)
...:
In [99]: np.allclose(out1, out2)
Out[99]: True
In [100]: np.allclose(out1, out3)
Out[100]: True
In [101]: %timeit np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
...: %timeit corr2_coeff_rowwise(M1, M2)
...: %timeit corr2_coeff_rowwise2(M1, M2)
...:
100 loops, best of 3: 9.5 ms per loop
1000 loops, best of 3: 554 µs per loop
1000 loops, best of 3: 430 µs per loop
20x+
ускорился там, где einsum
над встроенным np.corrcoef
!
Короткий ответ: , вы не можете .
Как правило, разрешения на уровне сервера не распространяются на отдельные объекты в базах данных. Единственным исключением является роль sysadmin
, которую я настоятельно рекомендую вам , а не использовать для этой цели, поскольку вы по существу передадите контроль над всем экземпляром сервера каждому члену. [1111 ]
В качестве краткости вы можете использовать встроенные роли базы данных, чтобы избавить себя от проблем. Для доступа только для чтения обычно достаточно членства в роли db_datareader
, если только у вас нет хранимых процедур, которые возвращают наборы данных, которые эта роль должна выполнять. Существует также аналогичная роль для модификации, db_datawriter
, но она не распространяется на разрешение execute
. Таким образом, для этого вам нужно будет создать собственную роль:
create role [DataChanger] authorization [dbo];
go
alter role [db_datareader] add member [DataChanger];
go
alter role [db_datawriter] add member [DataChanger];
go
grant execute to [DataChanger];
go
-- Now you can add your members. Here is a reader
create user [Domain\MyUser1] from login [Domain\MyUser1];
go
alter role [db_datareader] add member [Domain\MyUser1];
go
-- Writer
create user [Domain\MyUser2] from login [Domain\MyUser2];
go
alter role [DataChanger] add member [Domain\MyUser2];
go
Эти разрешения будут автоматически выбирать вновь созданные объекты, без необходимости явного добавления новых разрешений после каждой модификации схемы.
Вам придется делать это в контексте каждой пользовательской базы данных, которой вы хотите управлять таким образом. Вероятно, вы можете создать задание агента SQL, которое будет запускаться периодически, и вносить эти изменения в любые пользовательские базы данных, у которых их еще нет (например, если база данных была восстановлена из более ранней резервной копии, или перенесена с другого сервера, или нового один был создан). Кроме того, поскольку вы не можете циклически проходить по базам данных в статическом коде, вам нужно будет обернуть его в динамический SQL и выполнить цикл по sys.databases
или, возможно, с помощью недокументированной системной хранимой процедуры . Да, и не забудьте удалить все эти операторы go
из динамического кода, поскольку они не являются частью SQL и распознаются только SSMS и sqlcmd
.
P.S. Несмотря на это, я надеюсь, что вы не собираетесь управлять производственными базами данных таким образом. Я даже не знаю, с чего начать, насколько небезопасен этот подход.